65.9K
CodeProject 正在变化。 阅读更多。
Home

Visual Basic 9.0 中的对象初始化表达式和匿名类型

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.08/5 (3投票s)

2008年3月9日

CPOL

2分钟阅读

viewsIcon

38185

Visual Basic 9.0 语言语法中一些新的酷炫功能的介绍。

引言

Visual Basic 9.0 引入了一些新的语言特性,例如对象初始化器和匿名类型。如果您计划学习 LINQ,这是 .NET Framework 3.5 中的主要新特性,那么理解这些特性非常重要。

在本文中,我将介绍 Visual Basic 2008 中的对象初始化器和匿名类型,并提供一些代码片段以使概念更清晰。

您可以自由使用 Visual Basic 2008 Express Edition 或更高版本,因为编译器始终相同。

对象初始化表达式

对象初始化表达式是关于实例化构造函数不接收任何参数的对象,即使对象本身公开了一个或多个可以初始化的属性。 为了完成这个,在 Visual Basic 9.0 中,我们可以使用 With 关键字。 考虑以下非常简单的 Person 类,它公开了两个属性 NameSurname

Class Person

    Private _name As String
    Private _surName As String

    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

    Public Property SurName() As String
        Get
            Return _surName
        End Get
        Set(ByVal value As String)
            _surName = value
        End Set
    End Property
End Class

正如您所看到的,没有指定显式构造函数。 这意味着该类实现了一个不接收任何参数的构造函数。 要使用 Visual Basic 8.0 实例化此类,我们必须编写以下代码

Dim p As New Person

With p
     .Name = "Alessandro"
     .SurName = "Del Sole"
End With

现在,在 Visual Basic 9.0 中,我们可以使用以下语法

'Object Initialization Expression
Dim p As New Person With {.Name = "Alessandro", .SurName = "Del Sole"}

这对于编写更少的代码行并保持代码更清晰非常有用。 许多 WPF 对象都具有不接收任何参数的构造函数,因此这是在基类库中实例化对象的另一个好机会。

匿名类型

.NET Framework 3.5 的另一个有趣的新特性是所谓的匿名类型。 实质上,当您实例化一个对象时,您不需要指定它的类型,但您可以填充您自己感兴趣的元素。 这不应与本地类型推断混淆,本地类型推断是 .NET 3.5 的另一个特性,编译器会自动检测对象所属的类型。 匿名类型在 LINQ 查询表达式中非常重要。 现在,让我们看几个代码片段。 考虑以下代码片段

'Anonymous type
Dim firstAnonymous = New With {.Name = "Alessandro", .Age = 30}

这实例化了一个 firstAnonymous 对象,它是一个匿名类型。 正如您所看到的,在 New 关键字之后,没有指定类型,但是该对象已初始化并填充了两个成员,它们分别是 StringInteger(这里,我们再次使用了对象初始化表达式技术)。 这些成员被认为是正常的属性,并且每个匿名类型必须至少包含一个属性。 此外,匿名类型可以包含只读属性。 为了完成这个,您必须使用 Key 关键字标记每个属性,正如您可以在以下代码片段中看到的那样

'Anonymous type with two readonly properties
Dim secondAnonymous = New With {Key .Name = "Alessandro", Key .Age = 30}

重要的是要考虑到匿名类型仅在定义它们的成员中可见。 这不应该是一个大问题,因为正如我们之前所说,匿名类型的主要用途是在 LINQ 查询表达式中,而不是在类或模块级别。

关注点

我们刚刚看到的这两个是 VB 9.0 中两个非常重要的语言特性。 如果您计划认真使用 LINQ 进行数据查询,您应该深入了解一下。

© . All rights reserved.