自動プロパティ - c#6




C#の自動プロパティの初期化 (3)

C#6.0では可能です:

public int Y { get; } = 2;

この質問には既に回答があります:

私はこのようなクラスを書くのに慣れています:

public class foo {
  private string mBar = "bar";
  public string Bar {
    get { return mBar; }
    set { mBar = value; }
  }
  //... other methods, no constructor ...
}

バーを自動プロパティに変換するのは便利で簡潔ですが、コンストラクタを追加せずに初期化を保持するにはどうしたらいいですか?

public class foo2theRevengeOfFoo {
  //private string mBar = "bar";
  public string Bar { get; set; }
  //... other methods, no constructor ...
  //behavior has changed.
}

コンストラクタを追加することは、私が自動プロパティから得ようとしている労力を節約するインラインではないことがわかります。

これのようなものは私にはもっと意味をなさないでしょう:

public string Bar { get; set; } = "bar";

あなたはあなたのクラスのコンストラクタを使ってそれを行うことができます:

public class foo {
  public foo(){
    Bar = "bar";
  }
  public string Bar {get;set;}
}

あなたが別のコンストラクタ(つまり、パラメータを取るコンストラクタ)またはコンストラクタの束を持っているなら、これをいつでも持つことができます(コンストラクタチェーンと呼ばれます):

public class foo {
  private foo(){
    Bar = "bar";
    Baz = "baz";
  }
  public foo(int something) : this(){
    //do specialized initialization here
    Baz = string.Format("{0}Baz", something);
  }
  public string Bar {get; set;}
  public string Baz {get; set;}
}

既定のコンストラクターに常に呼び出しをチェーンする場合、すべての既定のプロパティの初期化を設定できます。 連鎖するとき、連鎖したコンストラクタが呼び出されるコンストラクタの前に呼び出されるので、より特殊化したコンストラクタが異なるデフォルトを適切に設定できるようになります。


デフォルトのコンストラクタ(およびあまりにも当然の場合はデフォルト以外のコンストラクタ):

public foo() {
    Bar = "bar";
}

とにかく舞台裏で起こっているので、これは私が信じている元のコードとあまり変わらないものです。







automatic-properties