Lazy(Of T)用法/初始化

时间:2013-01-30 01:07:46

标签: vb.net lazy-evaluation

我正在试图弄清楚这两种懒惰用法之间的区别,哪种更合适,或者它是否相同?

Dim context As New Lazy(Of DbContext)

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分: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 class的这两个构造函数:

  1. Lazy(Of T) Constructor
  2. Lazy(Of T) Constructor (Func(Of T))
  3. 根据MSDN,(1):

      

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

    对于(2):

      

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

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

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