.NET 11 の.NET ライブラリの新機能

この記事では、.NET 11 の.NET ライブラリの新機能について説明します。 プレビュー 3 で最後に更新されました。

文字列と文字に関する機能強化

.NET 11 では、文字列 API と文字操作 API が大幅に強化され、Unicode 文字とルーンを簡単に操作できます。

String メソッドでの Rune のサポート

String クラスには、Runeパラメーターを受け入れるメソッドが含まれるようになり、Unicode スカラー値を使用して文字列を直接検索、置換、操作できるようになりました。 これらの新しいメソッドは次のとおりです。

これらのメソッドの多くは、カルチャ対応の比較を行うStringComparison パラメーターを受け取るオーバーロードを含みます。

Char.Equals と StringComparison

Char構造体には、Char.Equals(Char, StringComparison) パラメーターを受け取るStringComparison メソッドが含まれるようになり、カルチャ対応または序数の比較を使用して文字を比較できるようになりました。

TextInfo での Rune のサポート

TextInfo クラスには、TextInfo.ToLower(Rune) パラメーターを受け入れるTextInfo.ToUpper(Rune)メソッドとRune メソッドが用意され、個々の Unicode スカラー値に対して大文字と小文字の変換を実行できるようになりました。

Base64 エンコードの機能強化

.NET 11 では、既存の Base64 型に新しい API とオーバーロードが追加され、Base64 のエンコードとデコードが包括的にサポートされます。 これらの追加により、既存の方法と比較してパフォーマンスと柔軟性が向上します。

新しい Base64 API

新しい API では、さまざまな入力形式と出力形式を使用したエンコードおよびデコード操作がサポートされています。

これらのメソッドは、高レベルの便利なメソッド (配列または文字列を割り当てて返す) と低レベルのスパンベースのメソッド (ゼロアロケーション シナリオの場合) の両方を提供します。

圧縮の機能強化

.NET 11 には、圧縮 API のいくつかの機能強化が含まれています。

ZIP アーカイブ エントリのアクセス モード

ZipArchiveEntry クラスでは、新しいオーバーロード (ZipArchiveEntry.Open(FileAccess)ZipArchiveEntry.OpenAsync(FileAccess, CancellationToken)) を使用して、特定のファイル アクセス モードでエントリを開く機能がサポートされるようになりました。 これらのオーバーロードは、 FileAccess パラメーターを受け取り、読み取り、書き込み、または読み取り/書き込みアクセス用に ZIP エントリを開くことを可能にします。

さらに、新しいCompressionMethod プロパティは、ZipCompressionMethodStored、およびDeflateの値を含む、Deflate64列挙型を介してエントリに使用される圧縮メソッドを公開します。

ZIP CRC32 検証

プレビュー 3 以降では、ZIP エントリを読み取るときに、 ZipArchive は CRC32 チェックサムを検証します。 以前にエラーなしで渡されたアーカイブが破損または切り捨てられた場合、 InvalidDataExceptionがスローされ、データ整合性の問題を早期に検出できるようになりました。

DeflateStream と GZipStream の動作の変更

.NET 11 以降では、DeflateStreamGZipStreamは、データが書き込まれていなくても、常にフォーマット ヘッダーとフッターを出力ストリームに書き込みます。 これにより、Deflate および GZip の仕様に従って、出力が有効な圧縮ストリームであることが保証されます。

以前は、データが書き込まれなかった場合、これらのストリームは出力を生成せず、空の出力ストリームが生成されていました。 この変更により、適切に書式設定された圧縮ストリームを必要とするツールとの互換性が確保されます。

詳細については、DeflateStream および GZipStream が空のペイロード用に書き込むヘッダーとフッターを参照してください。

BitConverter での BFloat16 のサポート

BitConverter クラスには、BFloat16値とバイト配列またはビット表現の間で変換するためのメソッドが含まれるようになりました。 これらの新しいメソッドは次のとおりです。

BFloat16 (頭脳浮動小数点) は、機械学習と科学コンピューティングでよく使用される 16 ビット浮動小数点形式です。

コレクションの機能強化

BitArray.PopCount

BitArray クラスに、配列内のBitArray.PopCount()に設定されたビット数を返すtrue メソッドが含まれるようになりました。 これにより、配列を手動で反復処理することなく、セット ビットをカウントする効率的な方法が提供されます。

JSON シリアル化での IReadOnlySet のサポート

JsonMetadataServices クラスに JsonMetadataServices.CreateIReadOnlySetInfo メソッドが含まれるようになり、IReadOnlySet<T> コレクションに対する JSON シリアル化のサポートが有効になりました。

URI データ スキーム定数

Uri.UriSchemeData URI スキームを表す新しいdata:定数が追加されました。 この定数は、データ URI を参照するための標準化された方法を提供します。

StringSyntax 属性の機能強化

StringSyntaxAttribute クラスに、一般的なプログラミング言語の定数が含まれるようになりました。

  • CSharp - C# 構文を示します。
  • FSharp - F# 構文を示します。
  • VisualBasic - Visual Basic構文を示します。

これらの定数は、 StringSyntax 属性と共に使用して、これらの言語のコードを含む文字列リテラルのツールサポートを向上させることができます。

System.Text.Json の機能強化

ジェネリック型情報の取得

System.Text.Json型メタデータを使用する場合の一般的なパターンは、JsonTypeInfo<T>からJsonSerializerOptionsを取得することです。 以前は、非ジェネリック GetTypeInfo(Type) メソッドから手動でダウンキャストする必要がありました。 新しいジェネリック JsonSerializerOptions.GetTypeInfo<T>() メソッドと JsonSerializerOptions.TryGetTypeInfo<T>(JsonTypeInfo<T>) メソッドは、厳密に型指定されたメタデータを直接返し、キャストを排除します。

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

これは、型メタデータ アクセスが一般的なソース生成、NativeAOT、およびポリモーフィックなシリアル化シナリオを操作する場合に特に便利です。

名前付けと既定値の無視

プレビュー 3 では、 System.Text.Jsonで使用できる名前付けオプションと無視オプションが展開されます。

  • JsonNamingPolicy.PascalCase: プロパティ名を PascalCase に変換する新しい組み込み名前付けポリシー。 既存の camelCase、snake_case、kebab-case ポリシーに加わります。
  • メンバーごとの名前付けポリシー: 新しい [JsonNamingPolicy] 属性を使用すると、個々のプロパティまたはフィールドの名前付けポリシーをオーバーライドして、カスタム コンバーターなしできめ細かく制御できます。
  • 型レベルの無視条件: クラスレベルまたは構造体レベルで [JsonIgnore(Condition = ...)] を適用すると、すべてのメンバーに対して既定の無視動作が設定されるため、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

Zstandard 圧縮

Zstandard 圧縮 API は、System.IO.CompressionDeflateStream、およびGZipStreamと共に、BrotliStream名前空間の一部になりました。 以前のプレビュー パッケージを参照した場合は、別のパッケージ参照を削除します。

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

それ以外の場合、API サーフェスは変更されません。

Tar アーカイブ形式の選択

CreateFromDirectoryおよびCreateFromDirectoryAsyncの新しいオーバーロードでは、TarEntryFormat パラメーターを受け取り、アーカイブ形式を直接制御できます。 以前は、 CreateFromDirectory は常にPaxアーカイブを作成しました。 新しいオーバーロードは、特定のツールや環境との互換性のために、4 つの tar 形式 (Pax、Ustar、GNU、V7) をすべてサポートします。

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

改良された数値処理

Matrix4x4 のパフォーマンス

Matrix4x4.GetDeterminant() SSE ベクター化された実装を使用し、パフォーマンスが約 15%向上しました。

低レベルの I/O の機能強化

SafeFileHandle パイプのサポート

SafeFileHandle プレビュー 3 で 2 つの新しいメンバーが得られます。

  • Type プロパティ: プラットフォーム固有のコードを必要とせずに、ハンドルがファイル、パイプ、ソケット、ディレクトリ、またはその他の OS オブジェクトを表すかどうかを報告します。
  • CreateAnonymousPipe メソッド: 接続された匿名パイプ ハンドルのペアを作成し、各エンドに対して独立した非同期動作を行います。
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 パイプサポート

RandomAccess.Read RandomAccess.Writeは、通常のファイル ハンドルに加えて、パイプなどのシーク不可能なハンドルで動作するようになりました。

Windowsでは、Process はリダイレクトされた stdout/stderr に重複した I/O を使用するようになりました。これにより、プロセス負荷の高いアプリケーションでのスレッド プールのブロックが軽減されます。

正規表現の機能強化

AnyNewLine オプション

新しい RegexOptions フラグ AnyNewLine^$. は、 \nだけでなく、Unicode 改行文字の完全なセットを行終端記号として扱います。 これは、Windows (\r\n)、Unix (\n)、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

こちらも参照ください