Lazy(Of T) 的使用 / 初始化

7

我正在努力弄清楚Lazy的这两种用法之间的区别,哪一种更适合使用,还是它们是相同的?

Dim context As New Lazy(Of DbContext)

Dim context As Lazy(Of DbContext) = New Lazy(Of DbContext)(Function() New DbContext())
2个回答

6
如果 lambda 函数仅使用默认构造函数来创建实例,那么效果与 Lazy<T> 的构造函数相同,不使用委托函数,只使用类型的默认构造函数。在这种情况下,建议使用第一种选项。
然而,第二种选项的原因是有时需要更多信息来构造对象。例如,以下代码是合法且可以正常运行的:
Dim instance = New Lazy(Of SomeType)(Function() New SomeType("Foo"))

请注意,这里我们使用了SomeType的非默认构造函数。

1

这个声明

Dim context As Lazy(Of DbContext) = New Lazy(Of DbContext)(Function() New DbContext())

与此功能上等同的是:

Dim context As New Lazy(Of DbContext)(Function() New DbContext())

因此,我们现在只需要使用这两个Lazy类的构造函数:

  1. Lazy(Of T) 构造函数
  2. Lazy(Of T) 构造函数 (Func(Of T))

根据MSDN,对于(1):

当进行延迟初始化时,将使用目标类型的默认构造函数。

对于(2):

当进行延迟初始化时,将使用指定的初始化函数。

因此,如果使用默认构造函数创建对象适用于您,请选择(1),否则选择(2)。请注意,您可以使用T的非默认构造函数,甚至可以使用父类型的构造函数,例如(String继承自Object):

Dim obj As New Lazy(Of Object)(Function() "123")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接