Lazyのこの2つの使用法の違いと、どちらを使用するのがより適切かを理解しようとしていますか、それともまったく同じですか?
Dim context As New Lazy(Of DbContext)
Dim context As Lazy(Of DbContext) = New Lazy(Of DbContext)(Function() New DbContext())
Lazyのこの2つの使用法の違いと、どちらを使用するのがより適切かを理解しようとしていますか、それともまったく同じですか?
Dim context As New Lazy(Of DbContext)
Dim context As Lazy(Of DbContext) = New Lazy(Of DbContext)(Function() New DbContext())
ラムダが既定のコンストラクターを使用してインスタンスを構築する以外に何もしていない場合、Lazy<T>
デリゲートなしのコンストラクターは型の既定のコンストラクターを使用するだけなので、効果は同じです。その場合、私はあなたの最初のオプションを使用します。
ただし、2 番目のオプションの理由は、オブジェクトを構築するために、より多くの情報が必要になる場合があるためです。たとえば、これは合法であり、正しく機能します。
Dim instance = New Lazy(Of SomeType)(Function() New SomeType("Foo"))
ここでは、デフォルト以外のコンストラクタを に使用していることに注意してくださいSomeType
。
この文
Dim context As Lazy(Of DbContext) = New Lazy(Of DbContext)(Function() New DbContext())
機能的にはこれと同等です:
Dim context As New Lazy(Of DbContext)(Function() New DbContext())
したがって、 Lazy クラスのこれら 2 つのコンストラクターの使用法は次のとおりです。
MSDNによると、(1)について:
遅延初期化が発生すると、ターゲット型の既定のコンストラクターが使用されます。
(2) の場合:
遅延初期化が発生すると、指定された初期化関数が使用されます。
したがって、デフォルトのコンストラクターを使用してオブジェクトを作成できる場合は (1) を選択し、それ以外の場合は (2) を選択します。T のデフォルト以外のコンストラクター、または親型のコンストラクターを使用できることに注意してください。これも機能します (String
継承元Object
):
Dim obj As New Lazy(Of Object)(Function() "123")