9

オブジェクト初期化子について学んだばかりで、それらをいつ使用する場合のベストプラクティスは何か疑問に思っていました。

これは私がそれらについて読んだものです:http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx 匿名型を作成するためにそれらが必要であることは明らかですが、私がすべきかどうか知りたいです他のすべての場合は、通常のコンストラクターよりもそれらを優先するようにしてください。

4

4 に答える 4

26

他のすべての場合に、通常のコンストラクターよりもそれらを優先する必要があるかどうかを知りたいです。

私はノーと言うでしょう。

コンストラクターには多くの利点があります。コンストラクターを使用すると、コンパイラーは必要なすべてのデータが型に提供されるように強制します。これは、無効な状態にあるタイプのインスタンスを作成できないようにすることができることを意味し、これにより、多くのバグを事前に防ぐことができます。

一方、オブジェクト初期化子には多くの欠点があります。初期化する必要があるすべてのデータに対して、パブリックに設定可能なプロパティを提供する必要があります。これらは構築時には必要ないため、このタイプのユーザーは誤って一部のデータを除外する可能性があります。

一般に、クラスが機能するために必要なものはすべて、コンストラクターで要求する必要がありますカスタム コンストラクターがある場合でもオブジェクト初期化子を使用できますが、クラスの設定でオプションのデータにのみ使用する必要があります。初期化で両方を混在させても問題ありません。つまり、次のことができます。

var yourInst = new YourClass(req1, req2) { OptionalProperty = opt1 }

これは、必要なコンストラクターのオーバーロードの数を減らすのに役立ちます (オプションの引数を使用するのと似ていますが、オプションの引数のバージョン管理のいくつかの欠点はありません)。

于 2013-03-21T18:37:12.820 に答える
10

あなたは物事を混乱させていると思います。

オブジェクト初期化子は、クラスのデフォルト (または指定された) コンストラクターを呼び出します! したがって、通常のコンストラクターの代わりにオブジェクト初期化子を実際に使用することはできません。したがって、オブジェクト初期化子を使用するときは、とにかくコンストラクターを呼び出しています。

設計しているクラスのオブジェクト初期化子について疑問に思っている場合でも、その答えは当てはまります。意味のある必要なコンストラクターを提供するようにしてください。オブジェクト初期化子を有効/許可するために特別なことをする必要はありません。これらは、バージョン 3.0 以降の C# コンパイラによって提供されるシンタックス シュガーであり、クラスのユーザーがクラスのパブリック メンバーを構築直後に初期化できるようにします。

于 2013-03-21T18:32:06.127 に答える
5

良い経験則は次のとおりです。

  • クラスを正しく動作させるために必要な場合は、コンストラクターのパラメーターにする必要があります
  • 変更するとクラスが壊れる場合は、コンストラクターのパラメーターにする必要があります
  • オプションであり、適切なデフォルトがある場合、および/またはクラスの動作を単純かつ安全に変更する場合は、初期化子にする必要があります。

イニシャライザの主な利点は、オブジェクトの作成時に設定する必要がないことです後で他のロジックに基づいて設定できます。

于 2013-03-21T18:33:03.520 に答える
2

現在、それらの使用に関して次の問題が発生しています。

  1. 割り当てられるプロパティは変更可能である必要があります。データがコンストラクターに渡された場合、そこでチェックして、提供されたデータが不十分または間違っている場合にオブジェクトの作成を失敗させる可能性があるため、これは望ましくないようです。データにプロパティを割り当てることができる場合、オブジェクトの状態が何であるか、すべてがまだ適切に作成されているかどうか、または他のどの状態にあるかを突然把握する必要があります。
  2. 割り当てられるプロパティはパブリックである必要があります。つまり、他の方法ではプライベートである可能性のあるものへのアクセスを公開し、後でインターフェイスなどを使用して制限する必要があります。

したがって、私の作業理論は次のとおりです。オブジェクト初期化子を使用しないでください。オブジェクト初期化子は愚かなことを助長します。

于 2013-03-21T18:27:23.487 に答える