rksoftware

Visual Studio とか C# とかが好きです

C# 14 の情報を振り返る その7 / C# 14 (.NET 10 世代の C# ) field キーワード / field-backed-properties

C# 14 (.NET 10 世代の C# ) の機能、field キーワード / field-backed-properties を見てみます。

■ これまでは

プロパティの値を getter または setter で加工したい場合、自身でバッキングフィールドを作成していました。

■ これからは

field キーワードがプロパティ自身の値として使えます。バッキングフィールドを作成する必要はありません。

■ コードで例

Class C
{
    // これはなら以前からできた
    int p1;                     // バッキングフィールド
    public int P1
    {
        get => p1;              // バッキングフィールドの値を返却
        set => p1 = (value > 0) // バッキングフィールドに値を設定
            ? value + 1
            : -1;
    }

    // これができるようになった
    public int P2
    {
        get;                        // デフォルト実装の書き方
        set => field = (value > 0)  // field キーワードに value を加工した値を設定
            ? value + 1
            : -1;
        // Preview バージョンを指定していない場合のエラー
        // 機能 'field キーワード' は現在、プレビュー段階であり、*サポートされていません*。プレビュー機能を使用するには、'preview' 言語バージョンを使用してください。
    }
}

■ getter での field

使う機会があるとは思えませんが、getter でも field キーワードが使えます。getter で 値を加工して返すばかりでなく、getter でプロパティ自身の値を変えることも。そんなコード見かけたら泣いてしまうかもしれませんが。

C c = new();
c.P3 = 1;
Console.WriteLine(c.P3); // 3
Console.WriteLine(c.P3); // 4

class C
{
    // こんなこともできる
    public int P3
    {
        get => ++field;             // getter で field キーワードを使用。field の値の変更も
        set => field = value + 1;
    }
}

■ 今回のコード

GitHub に上げています。

github.com

■ 備えよう

新機能、いいですね。リリースに備えましょう。