我试图弄清楚这两种懒惰的用法有什么区别,哪种更适合使用,还是一样?
Dim context As New Lazy(Of DbContext)
Dim context As Lazy(Of DbContext) = New Lazy(Of DbContext)(Function() New DbContext())
我试图弄清楚这两种懒惰的用法有什么区别,哪种更适合使用,还是一样?
Dim context As New Lazy(Of DbContext)
Dim context As Lazy(Of DbContext) = New Lazy(Of DbContext)(Function() New DbContext())
如果 lambda 只使用默认构造函数构造实例,则效果相同,因为Lazy<T>
没有委托的构造函数只使用类型的默认构造函数。在这种情况下,我会使用您的第一个选项。
然而,第二个选项的原因是您有时需要更多信息来构建您的对象。例如,这将是合法的并且可以正常运行:
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 类的这两个构造函数:
根据 MSDN,对于(1):
当发生延迟初始化时,使用目标类型的默认构造函数。
对于 (2):
当发生延迟初始化时,使用指定的初始化函数。
因此,如果使用默认构造函数创建对象适合您,请选择 (1),否则选择 (2)。请注意,您可以使用 T 的非默认构造函数,甚至可以使用父类型的构造函数,因此这也可以使用(String
继承自Object
):
Dim obj As New Lazy(Of Object)(Function() "123")