Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel werden neue Features in den .NET-Bibliotheken für .NET 11 beschrieben. Es wurde zuletzt für Preview 3 aktualisiert.
Verbesserungen bei Zeichenfolgen und Zeichen
.NET 11 führt erhebliche Verbesserungen an Zeichenfolgen- und Zeichenbearbeitungs-APIs ein, wodurch die Arbeit mit Unicode-Zeichen und Runen erleichtert wird.
Rune-Unterstützung in String-Methoden
Die String Klasse enthält jetzt Methoden, die Parameter akzeptieren Rune , sodass Sie Zeichenfolgen mithilfe von Unicode-Skalarwerten direkt durchsuchen, ersetzen und bearbeiten können. Zu diesen neuen Methoden gehören:
-
Contains- Überprüfen Sie, ob eine Zeichenfolge eine bestimmte Rune enthält: String.Contains(Rune) und String.Contains(Rune, StringComparison). -
StartsWithundEndsWith- Überprüfen, ob eine Zeichenfolge mit einem bestimmten Runenzeichen beginnt oder endet: String.StartsWith(Rune), String.StartsWith(Rune, StringComparison), String.EndsWith(Rune) und String.EndsWith(Rune, StringComparison). -
IndexOfundLastIndexOf- Finden Sie die Position einer Rune in einer Zeichenkette: String.IndexOf(Rune), String.IndexOf(Rune, StringComparison), String.LastIndexOf(Rune) und String.LastIndexOf(Rune, StringComparison). -
Replace- Ersetzen Sie Vorkommen einer Rune durch eine andere: String.Replace(Rune, Rune). -
Split- Teilen Sie eine Zeichenfolge mit einer Rune als Trennzeichen: String.Split(Rune, StringSplitOptions) und String.Split(Rune, Int32, StringSplitOptions). -
Trim,TrimStartundTrimEnd- Kürzen von Runen aus Zeichenfolgen: String.Trim(Rune), , String.TrimStart(Rune)und String.TrimEnd(Rune).
Viele dieser Methoden enthalten Überladungen, die einen Parameter vom Typ StringComparison für kulturbewusste Vergleiche entgegennehmen.
Char.Equals mit StringComparison
Die Char Struktur enthält jetzt eine Char.Equals(Char, StringComparison) Methode, die einen StringComparison Parameter akzeptiert, wodurch Sie Zeichen kulturabhängig oder ordinal vergleichen können.
Runenunterstützung in TextInfo
Die TextInfo-Klasse bietet jetzt TextInfo.ToLower(Rune)- und TextInfo.ToUpper(Rune)-Methoden, die Rune-Parameter annehmen, mit denen Sie Fallkonvertierungen für einzelne Unicode-Skalarwerte ausführen können.
Verbesserungen bei der Base64-Codierung
.NET 11 fügt dem vorhandenen Base64-Typ neue APIs und Überladungen hinzu und bietet umfassende Unterstützung für base64-Codierung und -Decodierung. Diese Ergänzungen bieten im Vergleich zu bestehenden Methoden eine verbesserte Leistung und Flexibilität.
Neue Base64-APIs
Die neuen APIs unterstützen Codierungs- und Decodierungsvorgänge mit verschiedenen Eingabe- und Ausgabeformaten:
- Codieren für Zeichen: EncodeToChars und EncodeToString
- Codierung in UTF-8: EncodeToUtf8
- Decodieren von Zeichen: DecodeFromChars
- Decodieren von UTF-8: DecodeFromUtf8
Diese Methoden bieten sowohl hochgradige Komfortmethoden (die Arrays oder Zeichenfolgen zuordnen und zurückgeben) als auch niedrigstufige span-basierte Methoden (für Nullzuordnungsszenarien).
Komprimierungsverbesserungen
.NET 11 enthält mehrere Verbesserungen an Komprimierungs-APIs.
Zugriffsmodi für ZIP-Archiveinträge
Die ZipArchiveEntry Klasse unterstützt jetzt das Öffnen von Einträgen mit bestimmten Dateizugriffsmodi über neue Überladungen: ZipArchiveEntry.Open(FileAccess) und ZipArchiveEntry.OpenAsync(FileAccess, CancellationToken). Diese Überladungen akzeptieren einen FileAccess-Parameter und ermöglichen es Ihnen, ZIP-Einträge für den Lese-, Schreib- oder Lese-/Schreibzugriff zu öffnen.
Darüber hinaus gibt es eine neue CompressionMethod-Eigenschaft, die die für einen Eintrag verwendete Komprimierungsmethode über die ZipCompressionMethod-Enumeration bekannt gibt, die Werte für Stored, Deflate und Deflate64 enthält.
ZIP CRC32-Überprüfung
Ab Preview 3, ZipArchive überprüft die CRC32-Prüfsumme beim Lesen von ZIP-Einträgen. Beschädigte oder abgeschnittene Archive, die zuvor ohne Fehler durchliefen, lösen jetzt einen Fehler aus InvalidDataException, wodurch Probleme mit der Datenintegrität frühzeitig erkannt werden können.
Änderung des DeflateStream- und GZipStream-Verhaltens
Ab .NET 11 schreiben DeflateStream und GZipStream immer Formatkopf- und Fußzeilen in den Ausgabedatenstrom, auch wenn keine Daten geschrieben werden. Dadurch wird sichergestellt, dass die Ausgabe ein gültiger komprimierter Datenstrom gemäß den Spezifikationen "Deflate" und "GZip" ist.
Bisher haben diese Datenströme keine Ausgabe erzeugt, wenn keine Daten geschrieben wurden, was zu einem leeren Ausgabedatenstrom führt. Diese Änderung stellt die Kompatibilität mit Tools sicher, die ordnungsgemäß formatierte komprimierte Datenströme erwarten.
Weitere Informationen finden Sie unter DeflateStream und GZipStream schreiben Kopf- und Fußzeilen für leere Nutzdaten.
BFloat16-Unterstützung in BitConverter
Die BitConverter Klasse enthält jetzt Methoden zum Konvertieren zwischen BFloat16 Werten und Bytearrays oder Bitdarstellungen. Zu diesen neuen Methoden gehören:
- BitConverter.GetBytes(BFloat16) - Konvertieren eines BFloat16-Werts in ein Bytearray.
- BitConverter.ToBFloat16(Byte[], Int32) und BitConverter.ToBFloat16(ReadOnlySpan<Byte>) - Konvertieren eines Bytearrays in einen BFloat16-Wert.
-
BitConverter.BFloat16ToInt16Bits(BFloat16), BitConverter.BFloat16ToUInt16Bits(BFloat16), BitConverter.Int16BitsToBFloat16(Int16), und BitConverter.UInt16BitsToBFloat16(UInt16) - Methoden für die Konvertierung zwischen BFloat16 und deren Bitdarstellung als
shortoderushort.
BFloat16 (Brain Floating Point) ist ein 16-Bit-Gleitkommaformat, das häufig in maschinellem Lernen und wissenschaftlichem Computing verwendet wird.
Verbesserungen bei Sammlungen
BitArray.PopCount
Die BitArray Klasse, die jetzt eine BitArray.PopCount() Methode enthält, gibt die Anzahl der Bits zurück, die im Array auf true gesetzt sind. Dies bietet eine effiziente Möglichkeit zum Zählen der gesetzten Bits ohne die manuelle Durchquerung des Arrays.
IReadOnlySet-Unterstützung in JSON-Serialisierung
Die JsonMetadataServices Klasse enthält jetzt eine JsonMetadataServices.CreateIReadOnlySetInfo Methode, die JSON-Serialisierungsunterstützung für IReadOnlySet<T> Sammlungen aktiviert.
URI-Datenschema-Konstante
Es wurde eine neue Uri.UriSchemeData Konstante hinzugefügt, die das data: URI-Schema darstellt. Diese Konstante stellt eine standardisierte Methode zum Verweisen auf Daten-URIs bereit.
Verbesserungen des StringSyntax-Attributs
Die StringSyntaxAttribute Klasse enthält jetzt Konstanten für allgemeine Programmiersprachen:
- CSharp - Gibt die C#-Syntax an.
- FSharp - Gibt die F#-Syntax an.
- VisualBasic – Gibt Visual Basic Syntax an.
Diese Konstanten können mit dem StringSyntax Attribut verwendet werden, um eine bessere Toolunterstützung für Zeichenfolgenliterale bereitzustellen, die Code in diesen Sprachen enthalten.
Verbesserungen bei System.Text.Json
Abrufen von generischen Typinformationen
Ein häufiges Muster beim Arbeiten mit System.Text.Json Typmetadaten ist das Abrufen eines JsonTypeInfo<T> von JsonSerializerOptions.
Bisher musste man die nicht-generische Methode GetTypeInfo(Type) manuell herunterstufen.
Die neuen generischen Methoden JsonSerializerOptions.GetTypeInfo<T>() und JsonSerializerOptions.TryGetTypeInfo<T>(JsonTypeInfo<T>) geben direkt stark typisierte Metadaten zurück, wodurch die Herunterstufung entfällt.
JsonSerializerOptions options = new(JsonSerializerDefaults.Web);
options.MakeReadOnly();
// Before: manual downcast required
JsonTypeInfo<MyRecord> info1 = (JsonTypeInfo<MyRecord>)options.GetTypeInfo(typeof(MyRecord));
// After: generic method returns the right type directly
JsonTypeInfo<MyRecord> info2 = options.GetTypeInfo<MyRecord>();
// TryGetTypeInfo variant for cases where the type may not be registered
if (options.TryGetTypeInfo<MyRecord>(out JsonTypeInfo<MyRecord>? typeInfo))
{
// Use typeInfo
_ = typeInfo;
}
Dies ist besonders hilfreich beim Arbeiten mit Quellgenerierungs-, NativeAOT- und polymorphen Serialisierungsszenarien, in denen der Typmetadatenzugriff üblich ist.
Standardwerte benennen und ignorieren
In Preview 3 werden die verfügbaren Optionen für Benennung und Ignorierung erweitert:System.Text.Json
-
JsonNamingPolicy.PascalCase: Eine neue eingebaute Benennungsrichtlinie, die Eigenschaftsnamen in PascalCase konvertiert. Es ergänzt die vorhandenen camelCase-, snake_case- und kebab-case-Richtlinien. -
Benennungsrichtlinie pro Mitglied: Mit dem neuen
[JsonNamingPolicy]Attribut können Sie die Benennungsrichtlinie für einzelne Eigenschaften oder Felder außer Kraft setzen, sodass Sie ein differenziertes Steuerelement ohne einen benutzerdefinierten Konverter erhalten. -
Ignorierbedingungen auf Typebene: Durch die Verwendung von
[JsonIgnore(Condition = ...)]auf Klassen- oder Strukturebene wird das Standard-Ignorierverhalten für alle Mitglieder festgelegt, sodass Sie das Attribut nicht mehr bei jeder nullfähigen Eigenschaft wiederholen müssen.
// Type-level JsonIgnore: all members use WhenWritingNull by default
// Per-member JsonNamingPolicy: EventName uses camelCase even though the
// serializer options use PascalCase
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.PascalCase
};
var data = new EventData { EventName = "Launch", Notes = null };
string json = JsonSerializer.Serialize(data, options);
Console.WriteLine(json);
// {"eventName":"Launch"} -- Notes omitted (null), EventName camel-cased
Zstandard-Komprimierung
Die Zstandard-Komprimierungs-APIs sind nun Teil des System.IO.Compression Namespaces, neben DeflateStream, GZipStreamund BrotliStream. Wenn Sie auf das frühere Vorschaupaket verwiesen haben, entfernen Sie den separaten Paketverweis:
-<PackageReference Include="System.IO.Compression.Zstandard" />
Die API-Oberfläche ist andernfalls unverändert.
Tar-Archivformatauswahl
Neue Überladungen von CreateFromDirectory und CreateFromDirectoryAsync akzeptieren einen TarEntryFormat-Parameter, sodass Sie das Archivformat direkt steuern können.
CreateFromDirectory stellte früher immer Pax-Archive her. Die neuen Überladungen unterstützen alle vier Tar-Formate – Pax, Ustar, GNU und V7 – zur Kompatibilität mit bestimmten Tools und Umgebungen.
// Create a GNU format tar archive for Linux compatibility
TarFile.CreateFromDirectory("/source/dir", "/dest/archive.tar",
includeBaseDirectory: true, format: TarEntryFormat.Gnu);
// Create a Ustar format archive for broader compatibility
using Stream outputStream = File.OpenWrite("/dest/ustar.tar");
TarFile.CreateFromDirectory("/source/dir", outputStream,
includeBaseDirectory: false, format: TarEntryFormat.Ustar);
// Async version
CancellationToken cancellationToken = CancellationToken.None;
await TarFile.CreateFromDirectoryAsync("/source/dir", "/dest/archive.tar",
includeBaseDirectory: true, format: TarEntryFormat.Pax,
cancellationToken: cancellationToken);
Verbesserungen bei numerischen Daten
Matrix4x4-Leistung
Matrix4x4.GetDeterminant() verwendet nun eine SSE-vektorisierte Implementierung, die die Leistung um ca. 15%verbessert.
Verbesserungen bei Low-Level-I/O
SafeFileHandle Pipe-Unterstützung
SafeFileHandle erhält zwei neue Mitglieder in der Vorschau 3:
-
Type-Eigenschaft: Gibt an, ob ein Handle eine Datei, eine Pipe, ein Socket, ein Verzeichnis oder ein anderes Betriebssystemobjekt darstellt, ohne dass plattformspezifischer Code erforderlich ist. -
CreateAnonymousPipe-Methode: Erstellt ein Paar verbundener anonymer Pipehandles mit unabhängigem asynchronem Verhalten für jedes Ende.
SafeFileHandle.CreateAnonymousPipe(
out SafeFileHandle readEnd,
out SafeFileHandle writeEnd,
asyncRead: true,
asyncWrite: false);
using (readEnd)
using (writeEnd)
{
// SafeFileHandle.Type reports the kind of OS object the handle refers to
Console.WriteLine(readEnd.Type); // Pipe
Console.WriteLine(writeEnd.Type); // Pipe
}
RandomAccess Pipe-Unterstützung
RandomAccess.Read und RandomAccess.Write funktionieren nun nicht nur mit regulären Datei-Handles, sondern auch mit nicht suchbaren Handles, wie beispielsweise Pipes.
Unter Windows verwendet Process nun Overlapped I/O für umgeleitete stdout/stderr-Ausgaben, wodurch die Blockierung des Thread-Pools in prozessintensiven Anwendungen verringert wird.
Verbesserungen von regulären Ausdrücken
AnyNewLine-Option
Ein neues RegexOptions Kennzeichen, AnyNewLineerstellt ^$, und . behandelt den vollständigen Satz von Unicode-Zeilenumbruchzeichen als Zeilenterminatoren – nicht nur \n. Dies hilft beim Analysieren von Text, der Windows (\r\n), Unix (\n) und Unicode-spezifische Zeilenenden (\u0085, \u2028, \u2029) kombiniert.
string text = "line1\r\nline2\u0085line3\u2028line4";
// RegexOptions.AnyNewLine makes ^, $, and . treat all Unicode newline
// sequences as line terminators, not just \n.
MatchCollection matches = Regex.Matches(
text,
@"^line\d$",
RegexOptions.Multiline | RegexOptions.AnyNewLine);
Console.WriteLine(matches.Count); // 4