1. ホーム
  2. c#

[解決済み】C#のオートプロパティの初期化【重複あり

2022-04-09 07:33:05

質問

こういう授業は書き慣れたものです。

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

Barをオートプロパティに変換するのは便利で簡潔なようですが、コンストラクタを追加してそこに初期化を入れずに初期化を保持するにはどうしたらよいでしょうか。

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";

解決方法は?

更新 - 以下の回答は、C# 6が登場する前に書かれたものです。C# 6では、以下のように書くことができます。

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

あなたは また これはコンストラクタでのみ書き込み可能です (ただし、デフォルトの初期値を設定することもできます)。

public class Foo
{
    public string Bar { get; }

    public Foo(string bar)
    {
        Bar = bar;
    }
}


今はその方法がないのが残念です。コンストラクタで値を設定する必要があります。(コンストラクタのチェーニングを利用すると重複を避けることができます)。

自動的に実装されるプロパティは、今は便利ですが、もっと素敵になるはずです。この種の初期化は、コンストラクタで設定できる読み取り専用の自動実装プロパティほど頻繁には必要ないと思いますし、読み取り専用のフィールドでバックアップされるでしょう。

C# 5までは実現されていませんでしたが、C# 6では計画されています。宣言の時点で初期化を可能にするという点では、どちらも同じです。 読み取り専用で自動実装されたプロパティをコンストラクタ本体で初期化できるようにする。