オブジェクト初期化子について学んだばかりで、それらをいつ使用する場合のベストプラクティスは何か疑問に思っていました。
これは私がそれらについて読んだものです:http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx 匿名型を作成するためにそれらが必要であることは明らかですが、私がすべきかどうか知りたいです他のすべての場合は、通常のコンストラクターよりもそれらを優先するようにしてください。
オブジェクト初期化子について学んだばかりで、それらをいつ使用する場合のベストプラクティスは何か疑問に思っていました。
これは私がそれらについて読んだものです:http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx 匿名型を作成するためにそれらが必要であることは明らかですが、私がすべきかどうか知りたいです他のすべての場合は、通常のコンストラクターよりもそれらを優先するようにしてください。
他のすべての場合に、通常のコンストラクターよりもそれらを優先する必要があるかどうかを知りたいです。
私はノーと言うでしょう。
コンストラクターには多くの利点があります。コンストラクターを使用すると、コンパイラーは必要なすべてのデータが型に提供されるように強制します。これは、無効な状態にあるタイプのインスタンスを作成できないようにすることができることを意味し、これにより、多くのバグを事前に防ぐことができます。
一方、オブジェクト初期化子には多くの欠点があります。初期化する必要があるすべてのデータに対して、パブリックに設定可能なプロパティを提供する必要があります。これらは構築時には必要ないため、このタイプのユーザーは誤って一部のデータを除外する可能性があります。
一般に、クラスが機能するために必要なものはすべて、コンストラクターで要求する必要があります。カスタム コンストラクターがある場合でもオブジェクト初期化子を使用できますが、クラスの設定でオプションのデータにのみ使用する必要があります。初期化で両方を混在させても問題ありません。つまり、次のことができます。
var yourInst = new YourClass(req1, req2) { OptionalProperty = opt1 }
これは、必要なコンストラクターのオーバーロードの数を減らすのに役立ちます (オプションの引数を使用するのと似ていますが、オプションの引数のバージョン管理のいくつかの欠点はありません)。
あなたは物事を混乱させていると思います。
オブジェクト初期化子は、クラスのデフォルト (または指定された) コンストラクターを呼び出します! したがって、通常のコンストラクターの代わりにオブジェクト初期化子を実際に使用することはできません。したがって、オブジェクト初期化子を使用するときは、とにかくコンストラクターを呼び出しています。
設計しているクラスのオブジェクト初期化子について疑問に思っている場合でも、その答えは当てはまります。意味のある必要なコンストラクターを提供するようにしてください。オブジェクト初期化子を有効/許可するために特別なことをする必要はありません。これらは、バージョン 3.0 以降の C# コンパイラによって提供されるシンタックス シュガーであり、クラスのユーザーがクラスのパブリック メンバーを構築直後に初期化できるようにします。
良い経験則は次のとおりです。
イニシャライザの主な利点は、オブジェクトの作成時に設定する必要がないことです。後で他のロジックに基づいて設定できます。
現在、それらの使用に関して次の問題が発生しています。
したがって、私の作業理論は次のとおりです。オブジェクト初期化子を使用しないでください。オブジェクト初期化子は愚かなことを助長します。