Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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ą:
-
Contains- Sprawdź, czy ciąg zawiera określony element rune: String.Contains(Rune) i String.Contains(Rune, StringComparison). -
StartsWithiEndsWith— sprawdź, czy ciąg rozpoczyna się lub kończy określonym znakiem: String.StartsWith(Rune), String.StartsWith(Rune, StringComparison), String.EndsWith(Rune) i String.EndsWith(Rune, StringComparison). -
IndexOfiLastIndexOf- znajdź pozycję elementu rune w ciągu: String.IndexOf(Rune), String.IndexOf(Rune, StringComparison), String.LastIndexOf(Rune), i String.LastIndexOf(Rune, StringComparison). -
Replace- Zastąp wystąpienia jednej runy inną: String.Replace(Rune, Rune). -
Split— Podziel ciąg przy użyciu elementu rune jako separatora: String.Split(Rune, StringSplitOptions) i String.Split(Rune, Int32, StringSplitOptions). -
Trim,TrimStartiTrimEnd— przycinanie run z ciągów: String.Trim(Rune), String.TrimStart(Rune) i String.TrimEnd(Rune).
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:
- Kodowanie do znaków: EncodeToChars i EncodeToString
- Kodowanie do formatu UTF-8: EncodeToUtf8
- Dekodowanie z znaków: DecodeFromChars
- Dekodowanie z utF-8: DecodeFromUtf8
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ą:
- BitConverter.GetBytes(BFloat16) - Przekonwertuj wartość BFloat16 na tablicę bajtów.
- BitConverter.ToBFloat16(Byte[], Int32) i BitConverter.ToBFloat16(ReadOnlySpan<Byte>) — konwertuj tablicę bajtów na wartość BFloat16.
-
BitConverter.BFloat16ToInt16Bits(BFloat16), BitConverter.BFloat16ToUInt16Bits(BFloat16), BitConverter.Int16BitsToBFloat16(Int16) i BitConverter.UInt16BitsToBFloat16(UInt16) — metody konwersji między BFloat16 a jego reprezentacją bitową jako
shortlubushort.
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:
-
TypeWłaściwość: Zgłasza, czy uchwyt reprezentuje plik, potok, gniazdo, katalog lub inny obiekt systemu operacyjnego, bez konieczności stosowania kodu specyficznego dla platformy. -
CreateAnonymousPipemetoda: 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