命名类型和匿名类型之比较 (Visual Basic)
用于声明匿名类型实例的格式类似于在使用对象初始值设定项声明命名类型实例时使用的格式。 但是,结果存在重大差异。
声明
在下面的示例中,product1 是匿名类型的实例,而 product2 是类 Product 的实例。 这两个声明都在其声明中使用了初始化列表。 这两个声明之间的唯一语法区别在于,在 New 之后没有为 product1 指定数据类型。 这使它成为匿名类型。
' Variable product1 is an instance of an anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
变量 product1 被强类型化为匿名类型的实例。 编译器根据您在声明中指定的属性来定义类型。 编译器使用局部类型推理 (Visual Basic)根据您提供的初始值来确定属性的数据类型。 在本示例中,匿名类型包含属性 Name 和 Price,它们的类型被分别推断为 String 和 Double。
提示
在上面的示例中,没有属性被指定为键属性。 因此,在确定同一类型的两个实例是否相等或实例的哈希代码值是多少时,这些属性不起作用。 但是,这些属性的值可以更改,而键属性的值是只读的。 有关键属性的更多信息,请参见匿名类型 (Visual Basic)。
在下面的示例中,product2 被强类型化为 Product 类的实例。 Name 和 Price 都必须是 Product 类的成员,它们的类型必须与声明中提供的值兼容。
' Variable product2 is an instance of Product.
Dim product2 = New Product With {.Name = "paperclips", .Price = 1.29}
有关更多信息,请参见对象初始值设定项:命名类型和匿名类型 (Visual Basic)。
差异
下面的列表比较这两个声明的其他方面:
局部类型推理确定 product1 是匿名类型的实例,而 product2 是 Product 类的实例。 这两个声明中都没有 As 子句,虽然对于 product2 来说,As 子句是可选的。
因为匿名类型没有指定的名称,所以不能使用 As 子句声明 product1。 必须推断其类型。 这就将匿名类型的使用范围限制为局部变量。
因为 product2 是命名类型 Product 的实例,所以可以使用 As 子句声明它,而无需使用类型推理。
Dim product2a As New Product With {.Name = "paperclips", .Price = 1.29}
如果 Product 中定义了适当的构造函数,则无需使用对象初始值设定项即可声明和初始化 product2。
Dim product2b As New Product("paperclips", 1.29)
或者,可以使用下面的语句系列来达到相同的效果。
Dim product2c As New Product product2c.Name = "paperclips" product2c.Price = 1.29
对于 product1,不能使用类似的声明,因为它的属性在初始值设定项列表本身中进行了命名和定义。
因为 product1、product2 和它们的属性都被强类型化,所以可以使用 IntelliSense 在使用任一对象的代码之间导航。
警告
匿名类型的名称由编译器生成,并可能随编译的不同而不同。 代码不应使用或依赖匿名类型的名称,因为重新编译项目时该名称可能更改。
请参见
任务
如何:推断匿名类型声明中的属性名和类型 (Visual Basic)