Co nowego w bibliotekach .NET dla .NET 11

W tym artykule opisano nowe funkcje w bibliotekach .NET dla .NET 11. Ostatnia aktualizacja dotyczyła wersji zapoznawczej 3.

Ulepszenia ciągów i znaków

.NET 11 wprowadza znaczące ulepszenia do interfejsów API manipulacji ciągami i znakami, co ułatwia pracę z znakami Unicode i runami.

Obsługa Rune w metodach String

Klasa String zawiera teraz metody, które akceptują Rune parametry, umożliwiając wyszukiwanie, zastępowanie i manipulowanie ciągami przy użyciu wartości skalarnych Unicode bezpośrednio. Te nowe metody obejmują:

Wiele z tych metod obejmuje przeciążenia, które przyjmują parametr StringComparison dla porównań uwzględniających kulturę.

Char.Equals z użyciem StringComparison

Struktura Char zawiera teraz metodę Char.Equals(Char, StringComparison) , która akceptuje StringComparison parametr, umożliwiając porównywanie znaków przy użyciu porównań z uwzględnieniem kultury lub porównań porządkowych.

Obsługa Rune w TextInfo

Klasa TextInfo teraz udostępnia metody TextInfo.ToLower(Rune) i TextInfo.ToUpper(Rune), które akceptują parametry Rune, umożliwiając wykonywanie konwersji wielkości liter dla poszczególnych wartości skalarnych Unicode.

Ulepszenia kodowania Base64

.NET 11 dodaje nowe interfejsy API i przeciążenia do istniejącego typu Base64, zapewniając kompleksową obsługę kodowania i dekodowania Base64. Te dodatki oferują lepszą wydajność i elastyczność w porównaniu z istniejącymi metodami.

Nowe interfejsy API Base64

Nowe interfejsy API obsługują operacje kodowania i dekodowania z różnymi formatami danych wejściowych i wyjściowych:

Te metody zapewniają zarówno wysokopoziomowe metody ułatwiające (które przydzielają i zwracają tablice lub ciągi), jak i niskopoziomowe metody oparte na spanach (dla scenariuszy bez alokacji).

Ulepszenia kompresji

.NET 11 zawiera kilka ulepszeń interfejsów API kompresji.

Tryby dostępu do elementu archiwum ZIP

Klasa ZipArchiveEntry obsługuje teraz otwieranie wpisów z określonymi trybami dostępu do plików dzięki nowym przeciążeniom: ZipArchiveEntry.Open(FileAccess) i ZipArchiveEntry.OpenAsync(FileAccess, CancellationToken). Te przeciążenia akceptują FileAccess parametr i umożliwiają otwieranie wpisów ZIP na potrzeby dostępu do odczytu, zapisu lub odczytu i zapisu.

Ponadto nowa CompressionMethod właściwość uwidacznia metodę kompresji używaną dla wpisu za pośrednictwem ZipCompressionMethod wyliczenia, które zawiera wartości dla Stored, Deflate i Deflate64.

Walidacja pliku ZIP CRC32

Począwszy od wersji zapoznawczej 3, ZipArchive sprawdza sumę kontrolną CRC32 podczas odczytywania wpisów ZIP. Uszkodzone lub obcięte archiwa, które wcześniej przeszły bez błędu, teraz wywołują błąd InvalidDataException, co pomaga w wczesnym wykrywaniu problemów z integralnością danych.

Zmiana zachowania DeflateStream i GZipStream

Począwszy od .NET 11, DeflateStream i GZipStream zawsze zapisują nagłówki i stopki formatu do strumienia wyjściowego, nawet jeśli żadne dane nie są zapisywane. Dzięki temu dane wyjściowe są prawidłowym skompresowanym strumieniem zgodnie ze specyfikacjami Deflate i GZip.

Wcześniej te strumienie nie wygenerowały żadnych danych wyjściowych, jeśli żadne dane nie zostały zapisane, co spowodowało powstanie pustego strumienia wyjściowego. Ta zmiana zapewnia zgodność z narzędziami, które oczekują prawidłowo sformatowanych skompresowanych strumieni.

Aby uzyskać więcej informacji, odwiedź DeflateStream i GZipStream zapisują nagłówki i stopki dla pustego ładunku.

Obsługa BFloat16 w aplikacji BitConverter

Klasa BitConverter zawiera teraz metody konwertowania między wartościami BFloat16 i tablicami bajtów lub reprezentacjami bitowymi. Te nowe metody obejmują:

BFloat16 (Brain Floating Point) to 16-bitowy format zmiennoprzecinkowy, który jest powszechnie używany w uczeniu maszynowym i obliczeniach naukowych.

Ulepszenia kolekcji

BitArray.PopCount

Klasa BitArray zawiera teraz metodę BitArray.PopCount() zwracającą liczbę bitów ustawionych na true w tablicy. Zapewnia to wydajny sposób zliczania zestawionych bitów bez ręcznego przeglądania tablicy.

Obsługa IReadOnlySet w serializacji JSON

Klasa JsonMetadataServices teraz zawiera metodę JsonMetadataServices.CreateIReadOnlySetInfo, umożliwiającą obsługę serializacji JSON dla IReadOnlySet<T> kolekcji.

Stała schematu danych identyfikatora URI

Dodano nową stałą Uri.UriSchemeData reprezentującą schemat URI data:. Ta stała zapewnia ustandaryzowany sposób odwołowania się do identyfikatorów URI danych.

Ulepszenia atrybutu StringSyntax

Klasa StringSyntaxAttribute zawiera teraz stałe dla typowych języków programowania:

  • CSharp - Wskazuje składnię języka C#.
  • FSharp - Wskazuje składnię języka F#.
  • VisualBasic — wskazuje składnię Visual Basic.

Te stałe mogą być używane z atrybutem StringSyntax w celu zapewnienia lepszej obsługi narzędzi dla literałów ciągów zawierających kod w tych językach.

Ulepszenia pliku System.Text.Json

Pobieranie informacji o typie ogólnym

Typowym wzorcem podczas pracy z metadanymi typu System.Text.Json jest pobranie JsonTypeInfo<T> z JsonSerializerOptions klasy. Wcześniej trzeba było ręcznie dokonać rzutowania w dół z metody niegenerycznej GetTypeInfo(Type). Nowe metody ogólne, JsonSerializerOptions.GetTypeInfo<T>() i JsonSerializerOptions.TryGetTypeInfo<T>(JsonTypeInfo<T>), zwracają silnie typizowane metadane bezpośrednio, eliminując potrzebę rzutowania.

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;
}

Jest to szczególnie przydatne podczas pracy z generowaniem kodu źródłowego, NativeAOT i scenariuszami serializacji polimorficznej, w których dostęp do metadanych typu jest powszechny.

Nazewnictwo i ignorowanie wartości domyślnych

Wersja zapoznawcza 3 rozszerza opcje nazewnictwa i ignorowania dostępne w programie System.Text.Json:

  • JsonNamingPolicy.PascalCase: Nowe wbudowane zasady nazewnictwa, które konwertują nazwy właściwości na PascalCase. Dołącza do istniejących zasad camelCase, snake_case i kebab-case.
  • Zasady nazewnictwa poszczególnych składowych: Nowy [JsonNamingPolicy] atrybut pozwala zmieniać zasady nazewnictwa dla indywidualnych właściwości lub pól, co umożliwia szczegółową kontrolę bez potrzeby stosowania niestandardowego konwertera.
  • Poziom typu ignoruje warunki: Zastosowanie [JsonIgnore(Condition = ...)] na poziomie klasy lub struktury ustawia domyślne zachowanie ignoruj dla wszystkich elementów członkowskich, więc nie trzeba już powtarzać atrybutu dla każdej właściwości dopuszczającej wartość null.
// 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

Kompresja Zstandard

API kompresji Zstandard są teraz częścią System.IO.Compression przestrzeni nazw, razem z DeflateStream, GZipStream i BrotliStream. Jeśli odwołujesz się do wcześniejszego pakietu w wersji zapoznawczej, usuń oddzielne odwołanie do pakietu:

-<PackageReference Include="System.IO.Compression.Zstandard" />

Powierzchnia interfejsu API jest w przeciwnym razie niezmieniona.

Wybór formatu archiwum Tar

Nowe przeciążenia na CreateFromDirectory i CreateFromDirectoryAsync akceptują parametr TarEntryFormat, dając ci bezpośrednią kontrolę nad formatem archiwum. CreateFromDirectory Wcześniej zawsze tworzono archiwa Pax. Nowe przeciążenia obsługują wszystkie cztery formaty tar — Pax, Ustar, GNU i V7 — w celu zapewnienia zgodności z określonymi narzędziami i środowiskami.

// 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);

Ulepszenia w zakresie numeryki

Wydajność macierzy 4x4

Matrix4x4.GetDeterminant() teraz używa wektoryzowanej implementacji SSE, poprawiając wydajność o około 15%.

Ulepszenia we/wy niskiego poziomu

Obsługa SafeFileHandle dla potoków

SafeFileHandle zyskuje dwóch nowych członków w wersji zapoznawczej 3:

  • Type Właściwość: Zgłasza, czy uchwyt reprezentuje plik, potok, gniazdo, katalog lub inny obiekt systemu operacyjnego, bez konieczności stosowania kodu specyficznego dla platformy.
  • CreateAnonymousPipe metoda: Tworzy parę połączonych anonimowych uchwytów potoków z niezależnym zachowaniem asynchronicznym dla każdego końca.
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
}

Obsługa potoku RandomAccess

RandomAccess.Read i RandomAccess.Write teraz działają z nieseekowalnymi uchwytami, takimi jak potoki, oprócz zwykłych uchwytów plików.

W Windows Process używa teraz nakładających się operacji we/wy na potrzeby przekierowania stdout/stderr, co zmniejsza blokowanie puli wątków w aplikacjach z dużą liczbą procesów.

Ulepszenia wyrażeń regularnych

Opcja AnyNewLine

Nowa flaga RegexOptions sprawia, że ^, $ i . traktują pełny zestaw znaków nowej linii Unicode jako terminatory linii – nie tylko \n. Pomaga to podczas analizowania tekstu, który miesza zakończenia wierszy Windows (\r\n), Unix (\n) i specyficzne dla Unicode (\u0085, \u2028, \u2029).

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

Zobacz także