Neuigkeiten in .NET Bibliotheken für .NET 11

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:

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:

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:

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:

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

Siehe auch