C# 14 のポイント
.NET 10 とともに出荷された C# 14 は、これまでの「拡張メソッド」と「プロパティのバッキングフィールド」にまつわる不満を一気に解消しました。プロダクトコードで特に効く 3 機能を紹介します。
1. Extension Members(拡張メンバー)
従来の拡張メソッドはメソッドしか追加できませんでしたが、C# 14 では extension ブロック内にプロパティ・インデクサー・静的メンバー・演算子まで定義できます。
public static class StringExtensions
{
extension(string s)
{
public bool IsNullOrWhiteSpace => string.IsNullOrWhiteSpace(s);
public string Reversed => new string(s.Reverse().ToArray());
}
}
// 利用側
if (" hello ".IsNullOrWhiteSpace) { /* ... */ }
var r = "abc".Reversed; // "cba"
ユーティリティクラスが DX 的にはほぼ「プリミティブ型の拡張」として使える感覚になります。LINQ の Enumerable 自体も内部的にこの形式にリファクタされました。
2. field キーワード
プロパティ本体から自動生成バッキングフィールドに直接アクセスできる field コンテキストキーワードが正式導入されました。検証ロジックや遅延初期化を書くときの定型コードが消えます。
public class User
{
public string Name
{
get;
set => field = value?.Trim()
?? throw new ArgumentNullException(nameof(value));
}
}
従来は private string _name; を手書きする必要があったのが 1 行消えます。地味ですが、DTO の多いコードベースで効果は大きいです。
3. nameof が open 型に対応
ジェネリック型を閉じずに型名だけを取れるようになりました。リフレクション周りのロギングで便利です。
var name = nameof(List<>); // "List"
var name2 = nameof(Dictionary<,>); // "Dictionary"
field・open 型 nameof の 3 軸で DX が底上げされる。そのほか目立つ更新
- 暗黙のスパン変換:
string→ReadOnlySpan<char>が暗黙に通る。 - null 条件代入:
obj?.Property = value;と書ける。 - partial コンストラクタ・partial イベント: Source Generator との相性が向上。
- ユーザー定義の複合代入演算子:
+=等を型独自に最適化できる。
導入コスト
C# 14 は後方互換性を保った追加機能が中心です。<LangVersion>14.0</LangVersion> に更新すれば段階的に活用できます。.NET 10 への移行と同時に言語バージョンも上げてしまうのが効率的です。
