パフォーマンスに関しては、実質的な違いはありません。フィールド初期化子は、コンストラクター ロジックとして実装されます。唯一の違いは、フィールド初期化子が「base」/「this」コンストラクターの前に発生することです。
コンストラクター アプローチは、自動実装されたプロパティで使用できます (フィールド初期化子は使用できません)。
[DefaultValue("")]
public string Foo {get;set;}
public Bar() { // ctor
Foo = "";
}
それ以外では、フィールド初期化構文を好む傾向があります。私はそれが物事をローカライズし続けていることを発見しました-つまり
private readonly List<SomeClass> items = new List<SomeClass>();
public List<SomeClass> Items {get {return items;}}
割り当てられている場所を見つけるためにあちこち探し回る必要はありません...
明らかな例外は、複雑なロジックを実行したり、コンストラクターのパラメーターを処理したりする必要がある場合です。この場合、コンストラクター ベースの初期化が適しています。同様に、複数のコンストラクターがある場合は、フィールドが常に同じ方法で設定されることが望ましいため、次のような ctor を使用できます。
public Bar() : this("") {}
public Bar(string foo) {Foo = foo;}
編集:サイドコメントとして、上記で、フィールド初期化子を持つ他のフィールド(表示されていない)がある場合、それらは呼び出すコンストラクター、base(...)
つまりpublic Bar(string foo)
ctorでのみ直接初期化されることに注意してください。他のコンストラクターは、フィールド初期化子がctorによって実行されることを認識しているため、それらを実行しません。this(...)