.NET 6 の新機能

.NET 6 では、.NET 5 から始まった .NET 統一計画の 最後の部分が提供されます。 .NET 6 では、モバイル、デスクトップ、IoT、クラウド アプリ全体で SDK、ベース ライブラリ、ランタイムが統一されます。 この統一に加えて、.NET 6 エコシステムには次の機能が用意されています。

  • 開発の簡略化: 作業を開始するのは簡単です。 C# 10 の新しい言語機能により、記述する必要があるコードの量が減ります。 また、Web スタックと最小限の API への投資によって、小規模で高速なマイクロサービスをすばやく簡単に記述できます。

  • パフォーマンスの向上: .NET 6 は、クラウドで実行している場合にコンピューティング コストを削減する、最速のフル スタック Web フレームワークです。

  • 最高レベルの生産性: .NET 6 および Visual Studio 2022 により、ホット リロード、新しい Git ツール、インテリジェントなコード編集、堅牢な診断とテスト ツール、チーム コラボレーションの向上が提供されます。

.NET 6 は、長期サポート (LTS) リリースとして 3 年間サポートされます

既定では、プレビュー 機能が無効になっています。 また、運用環境での使用もサポートされておらず、今後のバージョンでは削除される可能性があります。 新しい RequiresPreviewFeaturesAttribute はプレビュー API に注釈を付けるのに使用され、これらのプレビュー API を使用している場合は、対応するアナライザーによって警告が表示されます。

.NET 6 は、Visual Studio 2022 と Visual Studio 2022 for Mac (およびこれ以降のバージョン) でサポートされています。

この記事では、.NET 6 の新機能のすべてについては取り上げていません。 すべての新機能を確認したい場合、また、この記事に記載されている機能の詳細については「.NET 6 の発表」のブログ記事を参照してください。

パフォーマンス

.NET 6 には、多くのパフォーマンスの改善点が含まれています。 このセクションでは、FileStreamガイド付き最適化のプロファイルAOT コンパイルの機能強化の一部を示します。 より詳細な情報については、「.NET 6 のパフォーマンスの向上」のブログ記事を参照してください。

FileStream

System.IO.FileStream 型は.NET 6 用に書き換えられ、Windows におけるよりよいパフォーマンスと信頼性を提供します。 これで、Windows で非同期 I/O 用に作成された FileStream がブロックされることがなくなります。 詳細については、「.NET 6 でのファイル IO の向上」のブログ記事を参照してください。

ガイド付き最適化のプロファイル

ガイド付き最適化のプロファイル (PGO) は、JIT コンパイラが、最も頻繁に使用される型とコード パスの観点から最適化されたコードを生成する場所です。 .NET 6 では、動的 PGO が導入されています。 動的 PGO は階層型コンパイルと連動して、階層 0 で配置される追加のインストルメンテーションに基づいて、コードをさらに最適化します。 動的 PGO は既定で無効になっていますが、DOTNET_TieredPGO環境変数を使用して有効にすることができます。 詳細については、JIT のパフォーマンスの向上に関する記事を参照してください。

Crossgen2

.NET 6 では、Crossgen2 が導入されています。これは削除された Crossgen の後継です。 Crossgen と Crossgen2 は、アプリの起動時間を改善するために、Ahead-of-Time (AOT) コンパイルを提供するツールです。 Crossgen2 は C++ ではなく C# で記述され、以前のバージョンでは実現できなかった分析と最適化を行うことができます。 詳細については、「Crossgen2 に関する会話」を参照してください。

Arm64 のサポート

.NET 6 リリースには、ネイティブ Arm64 の実行と x64 エミュレーションの両方について、macOS Arm64 (または "Apple Silicon") および Windows Arm64 オペレーティング システムのサポートが含まれています。 さらに、x64 および Arm64 .NET インストーラーがサイド バイ サイドでインストールされます。 詳細については「.NET による macOS 11 および Windows 11 での Arm64 と x64 のサポート」を参照してください。

ホット リロード

ホット リロード は、アプリのソース コードを変更し、それらの変更を実行中のアプリに即座に適用することができる機能です。 この機能の目的は、編集間のアプリの再起動を回避することで生産性を向上させることです。 ホット リロードは、Visual Studio 2022 および dotnet watch コマンドライン ツールで使用できます。 ホット リロードは、ほとんどの種類の .NET アプリ、C#、Visual Basic、C++ ソース コードで動作します。 詳細については、ホット リロードに関するブログ記事を参照してください。

.NET MAUI

.NET Multi-Platform App UI (.NET MAUI) はまだ プレビュー 段階ですが、2022 年第 1 四半期にリリース候補が、2022 年第 2 四半期に一般提供 (GA) が予定されています。 .NET MAUI を使用すると、1 つのコードベースでデスクトップとモバイル オペレーティング システム用のネイティブ クライアント アプリを構築できます。 詳細については、「.NET Multi-Platform App UI の更新」のブログ記事を参照してください。

C# 10 とテンプレート

C# 10 には、global using ディレクティブ、ファイル スコープの名前空間宣言、レコード構造体などのイノベーションが含まれています。 詳細については、「C# 10 の新機能」を参照してください。

その作業に合わせて、C# 用の .NET SDK プロジェクト テンプレートが、新しい言語機能の一部を使用できるように最新化されました。

これらの新しい言語機能をプロジェクト テンプレートに追加すると、新しいコードはその機能を有効した状態で開始されます。 ただし、.NET 6 にアップグレードする場合、既存のコードには影響はありません。 これらのテンプレートの変更の詳細については、「.NET SDK: C# プロジェクト テンプレートの最新化」のブログ記事を参照してください。

F# と Visual Basic

F# 6 では、F# 言語と F# インタラクティブにいくつかの機能強化が加えられています。 詳細については、「F# 6 の新機能」を参照してください。

Visual Basic では、Visual Studio のエクスペリエンスと Windows フォーム プロジェクトの起動が改善されています。

SDK ワークロード

.NET SDK のサイズを小さく保つため、一部のコンポーネントは新しいオプションの SDK ワークロード に配置されています。 これらのコンポーネントには、.NET MAUI と Blazor WebAssembly AOT が含まれます。 Visual Studio をお使いの場合は、これにより必要な SDK ワークロードがすべてインストールされます。 .NET CLI をお使いの場合は、新しい dotnet workload コマンドを使用してワークロードを管理できます。

コマンド 説明
dotnet workload search 使用可能なワークロードを検索する。
dotnet workload install 指定されたワークロードをインストールする。
dotnet workload uninstall 指定されたワークロードを削除する。
dotnet workload update インストール済みのワークロードを更新する。
dotnet workload repair インストール済みのすべてのワークロードを再インストールして、破損したインストールを修復する。
dotnet workload list インストールされているワークロードを一覧表示する。

詳細については、オプションの SDK ワークロードに関するページを参照してください。

System.Text.Json API

.NET 6 では System.Text.Json に多くの改善が加えられたため、現在では "きわめて強力な" シリアル化ソリューションです。

ソース ジェネレーター

.NET 6 では、System.Text.Json の新しいソース ジェネレーターが追加されます。 ソース生成は JsonSerializer と連動し、複数の方法で構成できます。 これにより、パフォーマンスが向上し、メモリ使用量が減るほか、アセンブリのトリミングが容易になります。 詳細については、「System.Text.Json でリフレクションまたはソース生成を選択する方法」および「System.Text.Json でソース生成を使用する方法」を参照してください。

書き込み可能な DOM

既存の読み取り専用 DOM を補完する、書き込み可能な新しいドキュメント オブジェクト モデル (DOM) が追加されました。 新しい API では、単純な従来の CLR オブジェクト (POCO) 型を使用できない場合に、それに代わる軽量なシリアル化が提供されます。 また、大規模な JSON ツリーのサブセクションに効率的に移動して、配列を読み取るか、またはそのサブセクションから POCO を逆シリアル化することができます。 書き込み可能な DOM をサポートするために、次の新しい型が追加されました。

詳細については、「JSON DOM の選択肢」を参照してください。

IAsyncEnumerable のシリアル化

System.Text.Json により、IAsyncEnumerable<T> インスタンスによるシリアル化と逆シリアル化がサポートされるようになりました。 非同期シリアル化メソッドでは、オブジェクト グラフ内のすべての IAsyncEnumerable<T> インスタンスが列挙された後、それらが JSON 配列としてシリアル化されるようになりました。 逆シリアル化のために、新しいメソッド JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken) が追加されました。 詳細については、IAsyncEnumerable のシリアル化に関するページを参照してください。

その他の新しい API

検証と既定値の新しいシリアル化インターフェイスは、次のとおりです。

詳細については、「コールバック」を参照してください。

新しいプロパティの順序属性は、次のとおりです。

"生の" JSON を書き込む新しいメソッドは次のとおりです。

ストリームに同期するシリアル化と逆シリアル化は次のとおりです。

シリアル化中に参照サイクルが検出されたときに、オブジェクトを無視する新しいオプションを次に示します。

System.Text.Json によるシリアル化と逆シリアル化の詳細については、.NET での JSON のシリアル化と逆シリアル化に関するページを参照してください。

HTTP/3

.NET 6 には、HTTP/3 のプレビュー サポート (新しいバージョンの HTTP) が含まれています。 HTTP/3 は、QUIC と呼ばれる新しい基になる接続プロトコルを使用して、いくつかの既存の機能とパフォーマンスの問題を解決します QUIC は接続をより迅速に確立し、接続は IP アドレスに依存しないため、モバイルクライアントは Wi-fi と携帯ネットワークの間をローミングすることができます。 詳細については、「HttpClient で HTTP/3 を使用する」を参照してください。

ASP.NET Core

ASP.NET Core には、最小限の API の機能強化、Blazor WebAssembly アプリ用の Ahead-of-Time (AOT) コンパイル、シングルページ アプリが含まれています。 さらに、Blazor コンポーネントを JavaScript からレンダリングし、既存の JavaScript ベースのアプリと統合できるようになりました。 詳細については、「ASP.NET Core 6 の新機能」を参照してください。

OpenTelemetry

.NET 6 では、ソフトウェアのパフォーマンスと動作を分析するのに役立つツール、API、SDK のコレクションである OpenTelemetry のサポートが強化されています。 System.Diagnostics.Metrics 名前空間の API は、OpenTelemetry Metrics API 仕様 を実装します。 たとえば、さまざまなメトリック シナリオをサポートする 4 つのインストルメント クラスがあります。 インストルメント クラスは次のとおりです。

セキュリティ

.NET 6 には、Control-flow Enforcement Technology (CET) と "write exclusive execute" (W ^ X) という2つの主要なセキュリティ リスク軽減のためのプレビュー サポートが追加されています。

CET は、新しい Intel および AMD プロセッサで使用できる Intel のテクノロジです。 これにより、制御フローのハイジャック攻撃からの保護機能がハードウェアに追加されます。 .NET 6 では、Windows x64 アプリ用の CET がサポートされており、明示的に有効にする必要があります。 詳細については、.NET 6 と Intel の CET シャドウ スタックの互換性に関するページを参照してください。

W^X は、.NET 6 を使用するすべてのオペレーティングシステムで使用できますが、既定で有効になっているのは Apple シリコンのみです。 W^X は、メモリ ページの書き込みと実行可能ファイルを同時に禁止して、最も単純な攻撃パスをブロックします。

IL トリミング

自己完結型の展開のトリミングが改善されました。 .NET 5 では、使用されていないアセンブリのみがトリミングされました。 .NET 6 では、未使用の型とメンバーのトリミングも追加されています。 さらに、トリミングによって実行時に使用されるコードが削除される可能性がある場所に対して警告するトリミング警告が、既定で 有効 になりました。 詳細については、「自己完結型の展開と実行可能ファイルのトリミング」を参照してください。

コード分析

.NET 6 SDK には、API の互換性、プラットフォームの互換性、トリムの安全性、文字列の連結と分割での span の使用、文字列 API の高速化、コレクション API の高速化などに関する新しいコード アナライザーがいくつか含まれています。 新しい (および削除された) アナライザーの完全な一覧については、.NET 6 のアナライザーのリリースに関するページを参照してください。

カスタム プラットフォーム ガード

プラットフォーム互換性アナライザーは、OperatingSystem.IsWindows()などの OperatingSystem クラスのIs<Platform>メソッドをプラットフォーム ガードとして認識します。 .NET 6 では、カスタムのプラットフォーム ガードを有効にするために、次の 2 つの新しい属性を使用して、サポートされている、またはサポートされていないプラットフォーム名で、フィールド、プロパティ、またはメソッドに注釈を設定できます。

Windows フォーム

Application.SetDefaultFont(Font) は .NET 6 の新しいメソッドで、アプリケーション全体で既定のフォントを設定します。

C# Windows フォーム アプリのテンプレートが更新され、 global using ディレクティブ、ファイルスコープの名前空間、 Null 許容参照型がサポートされるようになりました。 また、アプリケーション ブートストラップ コードも含まれており、定型コードを削減し、Windows フォーム デザイナーによりデザイン サーフェイスを優先フォントでレンダリングすることができます。 ブートストラップ コードは ApplicationConfiguration.Initialize() への呼び出しです。これは、Application.EnableVisualStyles() のような他の構成メソッドへの呼び出しを出力する、ソースにより生成されたメソッドです。 また ApplicationDefaultFont MSBuild プロパティを使用して既定ではないフォントを設定した場合、ApplicationConfiguration.Initialize() により SetDefaultFont(Font) への呼び出しが出力されます。

詳細については、Windows フォームの新機能に関するブログ記事を参照してください。

ソース ビルド

.NET SDK のすべてのソースを含む source tarball は、.NET SDK ビルドの製品になりました。 Red Hat などの他の組織は、この source tarball を使用して独自のバージョンの SDK をビルドすることができます。

ターゲット フレームワーク モニカー

追加の OS 固有のターゲット フレームワーク モニカー (TFM) が、.NET 6 に加えられました。たとえば、net6.0-androidnet6.0-iosnet6.0-macos があります。 詳細については、「.NET 5 以降の OS 固有の TFM」を参照してください。

ジェネリック型数値演算

プレビュー の機能で、.NET 6 でジェネリック型に演算子を使えるようになりました。 .NET 6 では、C# 10 の新しいプレビュー機能である static abstract インターフェイス メンバーを使用する数多くのインターフェイスが導入されています。 これらのインターフェイスは、+ 演算子を表す IAdditionOperators などのさまざまな演算子に対応しています。 これらのインターフェイスは、System.Runtime.Experimental NuGet パッケージで使用できます。 詳細については、ジェネリック型数値演算 に関するブログ記事を参照してください。

NuGet パッケージの検証

NuGet ライブラリの開発者は、新しいパッケージ検証ツールを使用して、パッケージの一貫性と適切な形式かどうかを検証することができます。 次のことを確認できます。

  • パッケージのバージョン間の破壊的変更の有無。
  • パッケージに、ランタイム固有のすべての実装に対応した、同じパブリック API のセットが含まれているかどうか。
  • ターゲット フレームワークまたは実行時の適用性のギャップの有無。

詳細については、「パッケージの検証」のブログ記事を参照してください。

リフレクション API

.NET 6 では、コードを検査し、NULL 値の許容に関する情報を提供する次の新しい API が導入されています。

これらの API は、リフレクションベースのツールとシリアライザーに役立ちます。

Microsoft.Extensions API

次の表に示すように、.NET 6 では、いくつかの拡張機能の名前空間が改善されています。

名前空間 改善
Microsoft.Extensions.DependencyInjection CreateAsyncScope により、IAsyncDisposable サービスを登録するサービス プロバイダーの using ステートメントを安全に使用することができます。
Microsoft.Extensions.Hosting 新しい ConfigureHostOptions メソッドを適用すると、アプリケーションのセットアップが簡単になります。
Microsoft.Extensions.Logging Microsoft.Extensions.Logging には、高性能のログ API 用の新しいソース ジェネレーターが用意されています。 新しい LoggerMessageAttributepartial ログ メソッドに追加すると、ソース ジェネレーターがトリガーされます。 コンパイル時に、ジェネレーターにより partial メソッドの実装が生成されます。これは通常、既存のログ ソリューションよりも実行時により高速です。 詳細については、「コンパイル時のログ ソース生成」を参照してください。

新しい LINQ API

.NET 6 では、LINQ メソッドが多数追加されています。 次の表に一覧表示されている新しいメソッドのほとんどは、System.Linq.Queryable 型のメソッドと同等です。

メソッド 説明
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) 列挙型を強制せずに、シーケンス内の要素の数の測定を試みます。
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) シーケンスの要素を、指定されたサイズのチャンクに分割します。
Enumerable.MaxBy および Enumerable.MinBy キー セレクターを使用して最大または最小の要素を検索します。
Enumerable.DistinctByEnumerable.ExceptByEnumerable.IntersectBy、および Enumerable.UnionBy セットベースの操作を実行するこれらのメソッドの新しいバリエーションを使用すると、キー セレクター関数を使用して等値を指定できます。
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) および Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) シーケンスの始めまたは末尾から数えたインデックスを受け入れます。たとえば、Enumerable.Range(1, 10).ElementAt(^2) により 9 が返されます。
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) および Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource) および Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource) および Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
新しいオーバーロードを使用すると、シーケンスが空の場合に使用する既定値を指定できます。
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) および Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) 新しいオーバーロードを使用すると、比較子を指定できます。
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Range 引数を受け取り、シーケンスのスライスの取得を簡略化します。たとえば、source.Take(7).Skip(2) の代わりに source.Take(2..7) を使用できます。
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) 指定された 3 つ のシーケンスの要素を持つタプルのシーケンスを生成します。

日付、時刻、タイム ゾーンの機能強化

.NET 6 には、System.DateOnlySystem.TimeOnly という 2 つの構造体が追加されました。 これらは、それぞれ DateTime の日付部分と時刻部分を表します。 DateOnly は、誕生日や記念日に役立ち、毎日のアラームや毎週の営業時間 TimeOnly に役立ちます。

タイム ゾーン データがインストールされているすべてのオペレーティング システムで、Internet Assigned Numbers Authority (IANA) または Windows タイム ゾーン ID のいずれかを使用できるようになりました。 システムで要求されたタイム ゾーンが見つからない場合は、Windows タイム ゾーンから IANA タイム ゾーン (またはその逆) に入力を自動的に変換するように、TimeZoneInfo.FindSystemTimeZoneById(String) メソッドが更新されました。 さらに、あるタイム ゾーン形式から別のそれに手動で変換する必要があるシナリオのために、新しいメソッド TryConvertIanaIdToWindowsId(String, String)TryConvertWindowsIdToIanaId が追加されました。

他にもタイム ゾーンの機能強化がいくつかあります。 詳細については、「.NET 6 での日付、時刻、タイム ゾーンの機能強化」を参照してください。

PriorityQueue クラス

新しい PriorityQueue<TElement,TPriority> クラスは、値と優先順位の両方を持つ項目のコレクションを表します。 項目は優先度が高くなる順序でデキューされます。つまり、優先順位の値が最も低い項目が、最初にデキューされます。 このクラスは、最小ヒープ データ構造を実装します。

関連項目