C# 14 と .NET 10 の登場
2025 年 11 月にリリースされた .NET 10 と合わせて、C# 14 が正式に公開されました。.NET 10 は LTS ( 長期サポート ) バージョンであり、今後数年にわたって現場のメインストリームとなる見込みです。
C# 14 では言語仕様に複数の大きな改善が加わっており、日々の実装を少しずつ便利にしてくれる機能が揃っています。
本記事では、その中でも特に注目度の高い 3 つの新機能 ( field キーワード、拡張メンバー、nameof のアンバウンドジェネリック対応 ) を中心に、実務での活用ポイントを整理します。
field キーワードで自動実装プロパティを拡張する
自動実装プロパティは短く書ける一方で、setter にバリデーションや副作用を差し込みたくなった瞬間にバッキングフィールドを手動で書き直す必要があり、記述量が一気に増えてしまうという不便さがありました。C# 14 で追加された field キーワードは、この問題を解消するための新しい文法です。
プロパティの getter / setter の中で field と書くと、コンパイラーが暗黙的に生成するバッキングフィールドを直接参照できます。
public string Name
{
get => field;
set
{
if (string.IsNullOrWhiteSpace(value))
{
throw new ArgumentException("名前は空にできません");
}
field = value.Trim();
}
}
これまではバリデーションを挟むためだけに private string _name; を書き加える必要がありましたが、field キーワードの登場によりその手間がなくなりました。
なお、プロパティ内に field という名前の変数が既に存在する場合は、そちらが優先されて新機能は無効化されます。既存コードとの衝突を避けたい場合は、@field と記述することで従来どおり変数側にアクセスできます。
拡張メンバーで拡張できる範囲が広がる
C# の拡張メソッドは、これまでインスタンスメソッドしか定義できず、プロパティや静的メソッドを既存の型に後付けすることができませんでした。C# 14 ではこの制約が大きく緩和され、拡張メンバー ( extension members ) として拡張プロパティや静的拡張メソッドも記述できるようになっています。
構文は従来の拡張メソッドとは異なり、extension ブロックの中にメンバーを書く形です。
public static class StringExtensions
{
extension(string source)
{
public bool IsValidEmail => source.Contains('@') && source.Contains('.');
public string Reversed() => new string(source.Reverse().ToArray());
}
extension(string)
{
public static string Blank => " ";
}
}
上の例では string 型に IsValidEmail 拡張プロパティ、Reversed() 拡張インスタンスメソッド、Blank 静的拡張プロパティを追加しています。呼び出し側は通常のメンバーアクセスと同じ形で利用でき、対象型の読みやすさを損なわずに機能を拡張できます。
これまで拡張メソッド専用の静的クラスに無理やり押し込めて書いていたコードの多くが、拡張メンバーを使うことでより素直に記述できるようになりました。
nameof がアンバウンドジェネリック型に対応
ロギングやリフレクション系のコードでは、型名を文字列として取得するために nameof が頻繁に使われます。しかし C# 13 までは、nameof(List<>) のようにアンバウンド ( 型引数を埋めない ) なジェネリック型を渡すとコンパイルエラーになり、nameof(List<object>) のようにダミーの型引数を埋める必要がありました。
C# 14 ではこの制限が撤廃され、アンバウンドジェネリック型を直接 nameof に渡せるようになっています。
string listName = nameof(List<>); // "List"
string dictName = nameof(Dictionary<,>); // "Dictionary"
型引数が本質的に不要な場面で冗長な記述が減り、ログメッセージや例外メッセージをより直感的に構築できるようになります。
その他の注目機能
上記の 3 つ以外にも、C# 14 では実務で役立つ言語機能の追加・改善がいくつか行われています。
-
ユーザー定義の複合代入演算子
+=、-= などの複合代入演算子を型ごとに直接実装できるようになり、パフォーマンスが重要な数値型やベクトル型の実装で、不要な一時オブジェクトの生成を避けやすくなりました。 -
パーシャル ( partial ) のインスタンスコンストラクターとイベント
これまでパーシャル化できなかったインスタンスコンストラクターとイベントが対応し、ソースジェネレーターとの組み合わせで自動生成コードと手書きコードをより柔軟に分割できます。 -
params の対象型拡張
params が Span<T> や ReadOnlySpan<T> といったコレクション型にも対応し、可変長引数を受け取る API を追加のヒープ割り当てなしで実装できるケースが広がりました。
いずれも既存コードに大きな書き換えを強いるものではありませんが、新しいコードを書く際に選択肢が増えるという観点で恩恵の大きい変更です。
まとめ
C# 14 は、自動実装プロパティの表現力を高める field キーワード、extension ブロックで大幅に強化された拡張メンバー、nameof のアンバウンドジェネリック対応といった、日々の実装でじわじわと効いてくる機能が揃ったバージョンです。
.NET 10 は LTS のため長期にわたって利用される見込みなので、新規プロジェクトを立ち上げる場合はもちろん、既存プロジェクトでも移行を計画しつつ、まずは新機能を試せる範囲から C# 14 らしい書き方に少しずつ置き換えていくのがおすすめです。
コメント