C# 14 の新機能まとめ — Extension Members と field キーワードが効く場面
C# Tips

C# 14 の新機能まとめ — Extension Members と field キーワードが効く場面

公開: 更新: 約2分で読めます

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"
C# 14 の主要新機能(Extension Members / field / open 型 nameof)を並べた図
C# 14 の代表機能を俯瞰。拡張メンバー・field・open 型 nameof の 3 軸で DX が底上げされる。

そのほか目立つ更新

  • 暗黙のスパン変換: stringReadOnlySpan<char> が暗黙に通る。
  • null 条件代入: obj?.Property = value; と書ける。
  • partial コンストラクタ・partial イベント: Source Generator との相性が向上。
  • ユーザー定義の複合代入演算子: += 等を型独自に最適化できる。

導入コスト

C# 14 は後方互換性を保った追加機能が中心です。<LangVersion>14.0</LangVersion> に更新すれば段階的に活用できます。.NET 10 への移行と同時に言語バージョンも上げてしまうのが効率的です。