C# 12 には、次の新機能が含まれています。 これらの機能は、最新の Visual Studio 2022 バージョンまたは .NET 8 SDK を使用して試すことができます。
プライマリ コンストラクター - Visual Studio 2022 バージョン 17.6 Preview 2 で導入されました。
コレクション式 - Visual Studio 2022 バージョン 17.7 Preview 5 で導入されました。
インライン配列 - Visual Studio 2022 バージョン 17.7 Preview 3 で導入されました。
ラムダ式の省略可能なパラメーター - Visual Studio 2022 バージョン 17.5 Preview 2 で導入されました。
ref readonlyパラメーター - Visual Studio 2022 バージョン 17.8 Preview 2 で導入されました。任意の種類のエイリアス - Visual Studio 2022 バージョン 17.6 Preview 3 で導入されました。
試験段階の属性 - Visual Studio 2022 バージョン 17.7 Preview 3 で導入されました。
インターセプター - プレビュー機能Visual Studio 2022 バージョン 17.7 Preview 3 で導入されました。
C# 12 は、.NET 8 でサポートされています。 詳細については、C# 言語のバージョン管理 を参照してください。
.NETダウンロード ページから最新の .NET 8 SDK をダウンロードできます。 .NET 8 SDK を含む Visual Studio 2022 をダウンロードすることもできます。
Note
これらの機能に関するフィードバックに関心があります。 これらの新機能のいずれかに問題がある場合は、dotnet/roslyn リポジトリに新しい問題を作成します。
プライマリ コンストラクター
任意の class と structでプライマリ コンストラクターを作成できるようになりました。 プライマリ コンストラクターは、 record 型に制限されなくなりました。 プライマリ コンストラクター パラメーターは、クラスの本体全体のスコープ内にあります。 すべてのプライマリ コンストラクター パラメーターが確実に割り当てられるようにするには、明示的に宣言されたすべてのコンストラクターが、 this() 構文を使用してプライマリ コンストラクターを呼び出す必要があります。
classにプライマリ コンストラクターを追加すると、コンパイラは暗黙的なパラメーターなしのコンストラクターを宣言できなくなります。
structでは、暗黙的なパラメーターなしのコンストラクターは、プライマリ コンストラクター パラメーターを含むすべてのフィールドを 0 ビット パターンに初期化します。
コンパイラは、record型またはrecord class型のrecord struct型でのみ、プライマリ コンストラクター パラメーターのパブリック プロパティを生成します。 レコード以外のクラスと構造体では、プライマリ コンストラクター パラメーターに対してこの動作が常に必要であるとは限りません。
プライマリ コンストラクターの詳細については、プライマリ コンストラクターの探索に関 する チュートリアルと 、インスタンス コンストラクターに関する記事を参照してください。
コレクション表現
コレクション式では、共通のコレクション値を作成するための新しい簡潔な構文が導入されています。 これらの値に他のコレクションをインライン化することは、拡散要素 ..eを使用して可能です。
外部の BCL サポートを必要とせずに、いくつかのコレクションのような型を作成できます。 これらの型は次のとおりです。
- 配列型 (
int[]など)。 - System.Span<T> と System.ReadOnlySpan<T>.
- System.Collections.Generic.List<T>など、コレクション初期化子をサポートする型。
次の例は、コレクション式の使用方法を示しています。
// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];
// Create a list:
List<string> b = ["one", "two", "three"];
// Create a span
Span<char> c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];
// Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
// Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];
コレクション式でされる..eは、その式のすべての要素を追加します。 引数はコレクション型である必要があります。 次の例は、spread 要素の動作を示しています。
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{
Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,
spread 要素は、列挙式の各要素を評価します。 各要素は出力コレクションに含まれます。
コレクション式は、要素のコレクションが必要な任意の場所で使用できます。 コレクションの初期値を指定することも、コレクション型を受け取るメソッドに引数として渡すこともできます。 コレクション式の詳細については、コレクション式に 関する言語リファレンス記事 、または C# 標準の §12.8.25 コレクション式 句を参照してください。
ref readonly パラメーター
C# in 読み取り専用参照を渡す方法としてパラメーターを追加しました。
in パラメーターは変数と値の両方を許可し、引数に注釈を付けずに使用できます。
ref readonly パラメーターを追加すると、ref パラメーターまたはin パラメーターを使用している可能性がある API がより明確になります。
-
inが導入される前に作成された API では、引数が変更されていない場合でもrefが使用される場合があります。 これらの API は、ref readonlyで更新できます。refパラメーターがinに変更された場合と同様に、呼び出し元にとって重大な変更にはなりません。 たとえば System.Runtime.InteropServices.Marshal.QueryInterface です。 -
inパラメーターを受け取るが、論理的には変数を必要とする API。 値式が機能しません。 たとえば System.ReadOnlySpan<T>.ReadOnlySpan<T>(T) です。 -
refを使用する API は、変数を必要としますが、その変数は変更しません。 たとえば System.Runtime.CompilerServices.Unsafe.IsNullRef です。
ref readonlyパラメーターの詳細については、言語リファレンスのパラメーター修飾子または ref readonly パラメーター機能仕様に関する記事を参照してください。
既定のラムダ パラメーター
ラムダ式のパラメーターの既定値を定義できるようになりました。 構文と規則は、任意のメソッドまたはローカル関数に引数の既定値を追加するのと同じです。
ラムダ式の既定のパラメーターの詳細については、ラムダ式 に関する記事を参照してください。
任意の型の別名設定
using エイリアス ディレクティブを使用して、名前付き型だけでなく、任意の型にエイリアスを設定できます。 つまり、タプル型、配列型、ポインター型、またはその他の安全でない型のセマンティック エイリアスを作成できます。 詳細については、 §14.6.2 C# 標準でのエイリアス ディレクティブの使用に関するページを参照してください。 リファクタリングチュートリアルの例については、.NETブログの「エイリアスを使用してコードをリファクタリングする」を参照してください。
インライン配列
インライン配列は、アプリのパフォーマンスを向上させるために、ランタイム チームや他のライブラリ作成者によって使用されます。 インライン配列を使用すると、開発者は struct 型で固定サイズの配列を作成できます。 インライン バッファーを持つ構造体は、安全でない固定サイズ バッファーと同様のパフォーマンス特性を提供する必要があります。 独自のインライン配列は宣言しない可能性がありますが、ランタイム API からオブジェクトを System.Span<T> または System.ReadOnlySpan<T> として公開されている場合は透過的に使用します。
インライン配列は、次のstructのように宣言されます。
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
private int _element0;
}
他の配列と同様に使用します。
var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
buffer[i] = i;
}
foreach (var i in buffer)
{
Console.WriteLine(i);
}
違いは、コンパイラがインライン配列に関する既知の情報を利用できることです。 他の配列と同様にインライン配列を使用する可能性があります。 インライン配列を宣言する方法の詳細については、 struct 型の言語リファレンスを参照してください。
試験段階の属性
型、メソッド、またはアセンブリは、試験的特徴を示すために System.Diagnostics.CodeAnalysis.ExperimentalAttribute でマークできます。
ExperimentalAttribute の注釈が付いているメソッドまたは型にアクセスする場合、コンパイラから警告が出ます。
Experimental属性でマークされたアセンブリに含まれるすべての型は試験段階です。 詳しくは、 コンパイラによって読み取られた一般的な属性、または 機能の仕様に関する記事をご覧ください。
Interceptors
Warning
インターセプターは試験的な機能であり、C# 12 でプレビュー モードで利用できます。 この機能は、今後のリリースで破壊的変更または削除される可能性があります。 そのため、運用環境またはリリースされたアプリケーションには推奨されません。
インターセプターを使用するには、ユーザー プロジェクトでプロパティ <InterceptorsPreviewNamespaces>を指定する必要があります。 これは、インターセプターを含む名前空間の一覧です。
例えば: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>
インターセプターは、インターセプト可能なメソッドの呼び出しをコンパイル時にそれ自体の呼び出しに宣言的に置き換えることができるメソッドです。 この置換は、インターセプターがインターセプトする呼び出しのソースの場所を宣言することによって発生します。 インターセプターは、ソース ジェネレーターなど、コンパイルに新しいコードを追加することによって、既存のコードのセマンティクスを変更するための制限付き機能を提供します。
既存のソース コンパイルにコードを追加するのではなく、変更するソース ジェネレーターの一部として インターセプター を使用します。 ソース ジェネレーターは、インターセプター メソッドの呼び出しを インターセプター メソッドの呼び出しに置き換える。
インターセプターの実験に関心がある場合は、 機能の仕様を読んで詳細を確認できます。 この機能を使用する場合は、この実験用機能の機能仕様の変更を常に最新の状態に保ってください。 機能が完成した場合は、このサイトにガイダンスを追加します。
こちらも参照ください
.NET