6

我试图弄清楚这两种懒惰的用法有什么区别,哪种更适合使用,还是一样?

Dim context As New Lazy(Of DbContext)

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

2 回答 2

5

如果 lambda 只使用默认构造函数构造实例,则效果相同,因为Lazy<T>没有委托的构造函数只使用类型的默认构造函数。在这种情况下,我会使用您的第一个选项。

然而,第二个选项的原因是您有时需要更多信息来构建您的对象。例如,这将是合法的并且可以正常运行:

Dim instance = New Lazy(Of SomeType)(Function() New SomeType("Foo"))

请注意,这里我们为SomeType.

于 2013-01-30T01:17:01.547 回答
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")
于 2013-01-30T02:36:53.143 回答