Ver. 14.0
リリース時期 | 2025/11 |
---|---|
同世代技術 |
|
執筆予定: C# 14.0 トラッキング issue
field キーワード
field
という文脈キーワードが追加されました。
プロパティの get
/set
の中に field
と書くと、
バッキング フィールドを生成した上で、そのフィールドの読み書きができます。
例えば前述の例を field
を使って書き直すと以下のようになります。
using System.ComponentModel; using System.Diagnostics.CodeAnalysis; class FieldBackedProperties : INotifyPropertyChanged { // 遅延初期化: 最初のプロパティ アクセス時にインスタンスを生成。 public string X => field ??= ""; // set 側だけ null 許容(get 側で ?? で非 null 化)。 [AllowNull] public string Y { get => field ?? ""; set; } // INotifyPropertyChanged の実装: get 側だけ素通し。 public string? Z { get; set { if (field != value) { field = value; PropertyChanged?.Invoke(this, new(nameof(Z))); } } } public event PropertyChangedEventHandler? PropertyChanged; }
詳しくは「field キーワード」で説明します。
First-class Span
Span<T>
/ReadOnlySpan<T>
構造体を言語構文的に特別扱いするようなりました。
詳しくは「First-class Span」で説明します。
複合代入演算子のオーバーロード
複合代入演算子を直接オーバーロードできるようになりました。
record struct X(int Value) { public void operator +=(int value) => Value += value; public void operator -=(int value) => Value -= value; public void operator *=(int value) => Value *= value; public void operator /=(int value) => Value /= value; public void operator %=(int value) => Value %= value; public void operator &=(int value) => Value &= value; public void operator |=(int value) => Value |= value; public void operator ^=(int value) => Value ^= value; public void operator <<=(int value) => Value <<= value; public void operator >>=(int value) => Value >>= value; public void operator >>>=(int value) => Value >>>= value; public void operator checked +=(int value) { checked { Value += value; }; } public void operator checked -=(int value) { checked { Value += value; }; } public void operator checked *=(int value) { checked { Value += value; }; } public void operator checked /=(int value) { checked { Value += value; }; } public void operator ++() => Value++; public void operator --() => Value--; public void operator checked ++() { checked { Value++; } } public void operator checked --() { checked { Value--; } } }
以前から二項演算子(+
など)のオーバーロードをすることで、それに対応する複合代入(+=
など)ができていましたが、この実装だとコピーのコストが不可避でした。
複合代入演算子を直接オーバーロードすることでこのコストを削減できます。
詳しくは「複合代入演算子のオーバーロード」で説明します。
その他
部分イベントと部分コンストラクター
部分プロパティ (C# 13)に続いて、 C# 14 ではイベントとコンストラクターも部分定義できるようになりました。
// 元コード(手書き想定)。 partial class PartialClass { // 部分イベント。 public partial event Action<int>? PartialEvent; // 部分コンストラクター。 public partial PartialClass(); } // コード生成で作ってもらう前提のコード。 partial class PartialClass { private Action<int>? _partialEvent; public partial event Action<int>? PartialEvent { add => _partialEvent += value; remove => _partialEvent -= value; } public partial PartialClass() { } }
unbound な型に対する nameof
T<>
みたいに型引数を埋めていないジェネリック型(これを unbound (未束縛)とか open (開きっぱなし) な型といいます)に対して nameof
演算子を使えるようになりました。
Console.WriteLine(nameof(List<>)); // "List" Console.WriteLine(nameof(Dictionary<,>.Keys)); // "Keys" Console.WriteLine(nameof(List<>.Enumerator.MoveNext)); // "MoveNext"
詳しくは「unbound な型に対する nameof」で説明します。