C#12の新機能(一部抜粋)

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

他にもいくつか新機能があるのだが、すぐに使えそうなのはこれぐらいかな。

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, C#, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください