概要
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; } }