額面どおり、オブジェクト初期化子は .net 4.0 の「コード コントラクト」に問題をもたらすように思われます。通常は、オブジェクト コンストラクターが終了するまでに不変条件を確立する必要があります。ただし、おそらく、オブジェクト初期化子では、構築が完了した後にプロパティを設定する必要があります。
私の質問は、コンストラクターが完了する前にプロパティが設定されたかのように、「コード コントラクト」の不変条件がオブジェクト初期化子を処理できるかどうかです。それは確かにとてもいいでしょう!
額面どおり、オブジェクト初期化子は .net 4.0 の「コード コントラクト」に問題をもたらすように思われます。通常は、オブジェクト コンストラクターが終了するまでに不変条件を確立する必要があります。ただし、おそらく、オブジェクト初期化子では、構築が完了した後にプロパティを設定する必要があります。
私の質問は、コンストラクターが完了する前にプロパティが設定されたかのように、「コード コントラクト」の不変条件がオブジェクト初期化子を処理できるかどうかです。それは確かにとてもいいでしょう!
コード コントラクトは、オブジェクト初期化子の最後に不変条件への追加の呼び出しを挿入できると思いますが、それが使用されていることがわかる場合です。(ソース コードではなく IL を主に使用していることを忘れないでください。私の知る限り、ソース コードはエラー メッセージの生成にのみ使用されます。)
ただし、これは設計が不十分だと思います-オブジェクト初期化子の不幸な性質に励まされています。オブジェクト初期化子の後にプロパティを設定することについてどうしますか? オブジェクトが再び無効になる可能性があります。
基本的に、少なくともいくつかのプロパティを不変にする必要があるように聞こえますが、オブジェクト初期化子の単純さの利点が必要です。C# 4 の名前付き引数とオプションのパラメーターは、この一部を提供します。すべての適切なプロパティ (および既定値) を持つコンストラクターを作成すると、次のように呼び出すことができます。
Person person = new Person(firstName: "Jon", lastName: "Skeet");
これは、オブジェクト初期化子の構文からそれほど離れていません。
Person person = new Person { FirstName = "Jon", LastName = "Skeet" };
それは理想的ではなく、C# が不変型 (作成と使用の両方) をもっとサポートすることを望みますが、それは始まりです...