私は主にC++開発者ですが、最近はC#でプロジェクトを進めています。今日私は、オブジェクトイニシャライザを使用している間、少なくとも私には予期せぬ動作を経験しました。私はここにいる誰かが何が起こっているのかを説明できることを願っています。私が期待するようC#では、フィールドイニシャライザとオブジェクトイニシャライザはどのように相互作用しますか?
例A
public class Foo {
public bool Bar = false;
}
PassInFoo(new Foo { Bar = true });
例B
public class Foo {
public bool Bar = true;
}
PassInFoo(new Foo { Bar = false });
例Aで動作します。 PassInFooに渡されたオブジェクトには、Barがtrueに設定されています。ただし、例Bでは、foo.Barがtrueに設定されていますが、オブジェクト初期化子でfalseが割り当てられています。例Bのオブジェクトイニシャライザが一見無視される原因は何ですか?
何もありません。あなたはあなたが見ていると思っているものを見ていません。 – mquander
これを再現することはできません.Net 3.5では、どのバージョンがありますか、これはあなたが見ている動作ですか? –
コンストラクタは、オブジェクト初期化子とフィールド初期化子がコンストラクタの一部である前に実行されます。 C#仕様:7.6以降を参照してください。10- オブジェクトイニシャライザまたはコレクションイニシャライザを含むオブジェクト作成式の処理は、まずインスタンスコンストラクタを処理した後、オブジェクトイニシャライザ(§7.6.10.2)またはコレクションイニシャライザ(§7.6)で指定されたメンバまたは要素の初期化を処理することから成ります。 10.3)。 – VinayC