.NET8でサポートされる、C#12の新機能を調べてみた。
①コレクション式
コレクション式は配列やList等の初期化や代入などに使用できる。
以下のような感じ。
int[] iary_old = new int[] { 1, 2, 3, 4 }; // 従来
int[] iary_new = [ 1, 2, 3, 4 ]; // C#12以降
List<string> slst_old = new List<string>() { "Hello" , "World" }; // 従来
List<string> slst_new = [ "Hello" , "World" ]; // C#12以降
newと初期化を一緒に行うシンタックスシュガーだね。
また、スプレッド演算子”..”というものが使用できる。これを、コレクションの前につけると、コレクションの要素に置き換わる。
> int[] a = [1,2,3];
> int[] b = [4,5,6];
> int[] c = [..a,..b];
> c
int[6] { 1, 2, 3, 4, 5, 6 }
②ラムダ式パラメータのデフォルト値
ラムダ式のパラメータにデフォルト値を設定することができるようになった。
var PlusN = ( int Value, int Addition=1 ) => Value + Addition;
Console.WriteLine($"PlusN(10)={PlusN(10)}");
Console.WriteLine($"PlusN(10,2)={PlusN(10,2)}");
/* 結果
PlusN(10)=11
PlusN(10,2)=12
*/
// NGパターン
Func<int,int,int> PlusN = ( Value, Addition=1 ) => Value + Addition;
// error CS9098: 暗黙的に型指定されたラムダパラメーター 'Addition' に既定値を指定することはできません。
Func<int,int,int> PlusN = ( int Value, int Addition=1 ) => Value + Addition;
// warning CS9099: パラメーター 2 のラムダでの既定値は '1' だが、ターゲットデリゲート型では '<missing>' です。
パラメータの型を明示的に指定しないと、デフォルト値の設定は出来ないようだ。
また、型として引数の数を指定してしまうとコンパイル時に警告が出て、実行時にデフォルトパラメータを指定しないと、実行時エラー
CS7036: ‘arg2’ の必要なパラメーター ‘Func’ に対応する特定の引数がありません
となってしまう。
③プライマリコンストラクタ
record型では以前からサポートされていたが、classやstructでも使用できるようになった。
public class Person(string Name, string Mail, DateTime Birthday) {
public string Name { get; } = Name;
public string Mail { get; } = Mail;
public DateTime Birthday { get; } = Birthday;
}
他にもいくつか新機能があるのだが、すぐに使えそうなのはこれぐらいかな。