Microsoftは、.NET 11とともに登場するバージョンであるC# 15のプレビューで利用できる新機能を発表した。今回の更新には、共用体型、閉じた階層、アンセーフコードを扱う更新モデルのプレビューに加え、日常的な利用で繰り返される手続き的なコードを減らすことを目的とした小規模な変更が含まれる。
コレクション式内の引数
C#のコレクション式は、値を複数のコレクション型に変換できるが、これまでは基本コンストラクターや作成メソッドに引数を渡すことができなかった。C# 15では、式の先頭に置いてこれらの引数を渡すための、with(...)という新しい要素が追加される。
これにより、例えば式の中で容量を直接指定してリストを作成したり、StringComparer.OrdinalIgnoreCaseを渡してHashSetを作成したりできるようになる。作成と要素の追加を分ける必要はない。Microsoftは、この機能が、キーに使用する比較器を指定する必要が生じる可能性が高い、将来予定されている辞書式の構築への道を開くものだと説明している。
拡張インデックスによる要素へのアクセス
C# 14では、メソッドに加えてプロパティや演算子にも拡張メンバーが追加された。C# 15ではこのモデルが拡張インデックスにも広げられる。これにより、受け取ったオブジェクトの要素に、そのインデックスが型内に元から定義されているかのようにアクセスできる。
Microsoftが示す例では、IEnumerable<int>の要素にアクセスするために、ElementAtIndexのようなヘルパーメソッドが必要だった。新しい構文では、受け取ったオブジェクトに関連付けられた拡張インデックスを通じて、numbers[2]と記述できる。ブログでは、インデックスを静的にすることはできないため、拡張コンテナーには名前付きの受け取り対象を含める必要があると説明されている。
breakとcontinueのループラベル
C# 15では、反復ループに名前を付け、そのループに直接breakまたはcontinueを向けられるようになる。これは入れ子になったループで役立つ。これまでは、外側のループを抜けるために、通常はブール変数を使うか、gotoを使用するか、ロジックを別のメソッドに移す必要があった。
実際には、ラベルによってコード内で終了対象が明確になり、目的の要素が見つかったかどうかを追跡する変数が不要になる。例ではscanという名前のループを示し、break scanを使ってそこから直接抜けられるようにしている。
開発者にとって何が変わるのか
これらの機能は、.NETの実行モデルを変更するというより、コードの構文を整理し、繰り返される定型処理の一部を減らすものだ。特に、コレクション式を使用するプロジェクト、入れ子になったループを扱うプロジェクト、拡張可能な型に対してより簡潔なアクセスインターフェースを必要とするプロジェクトで、その価値が際立つ。
ただし、これらの機能は依然としてプレビュー段階にあり、まだ最終的な安定版インターフェースではない。Microsoftは開発者に対し、.NET 11をダウンロードして各自のアプリケーションでC# 15を試し、新機能の完全なリファレンスを確認するとともに、csharplangプロジェクトで進行中の議論に参加するよう呼びかけている。この資料では、これらの機能が安定版に移行する最終的な時期は示されていない。