はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】C#9.0から登場したコンストラクタ・オブジェクト初期化子のみで変更可能なinitアクセサーについて

はじめに

今回はC#9.0から登場したinitアクセサーについて取り上げたいと思います。
learn.microsoft.com

概要

initアクセサーを用いることでコンストラクタもしくはオブジェクト初期化子のときのみ変更できるようにできます。

class Sample
{
    public int Value { get; init; }

    public Sample() { }

    public Sample(int value)
    {
        // コンストラクタでの変更はOK
        Value = value;
    }

    static void Main(string[] args)
    {
        // オブジェクト初期化子もOK
        var sample = new Sample { Value = 10 };

        // コンストラクタ・オブジェクト初期化子以外はダメ(イミュータブル)
        // sample.Value = 20;
    }
}
変更方法 set/initなし init set
コンストラクタ
オブジェクト初期化子 ×
それ以外 × ×

サンプルコード

class Sample
{
    public int Value { get; }

    public Sample() { }

    public Sample(int value)
    {
        // コンストラクタでの変更はOK
        Value = value;
    }

    static void Main(string[] args)
    {
        // オブジェクト初期化子はダメ
        // var sample = new Sample { Value = 10 };

        // コンストラクタ・オブジェクト初期化子以外はダメ(イミュータブル)
        // sample.Value = 20;
    }
}
class Sample
{
    public int Value { get; set; }

    public Sample() { }

    public Sample(int value)
    {
        // コンストラクタでの変更はOK
        Value = value;
    }

    static void Main(string[] args)
    {
        // オブジェクト初期化子はOK
        var sample = new Sample { Value = 10 };

        // コンストラクタ・オブジェクト初期化子以外もOK
        sample.Value = 20;
    }
}