将X视为新Y与Dim X为Y =新Y()

时间:2009-05-11 14:19:14

标签: .net vb.net syntax

  

复制

     

Whats the difference between declaring as new and as something new something i

很遗憾我不知道这一点,但任何人都可以解释它们之间的区别:

Dim X as New Y

Dim X as Y = New Y()

3 个答案:

答案 0 :(得分:13)

第一个只是推断出类型是Y.第二个指定它。这允许您编写如下内容:

Dim X as IList(Of String) = New List(Of String)

然后限制了使用List(Of String)的选择范围 - 这意味着稍后您可能会选择使用IList(Of String)的不同实现,并且它仍然会编译。

当然,较短版本的 具有简洁的好处 - 如果你有很长的类型名称(例如使用嵌套泛型),这可能很重要。它也是匿名类型所必需的,你不能表达X的类型。

答案 1 :(得分:8)

Jon Skeet已经提供了正确的答案,但我想我会增加一些额外的答案......

虽然这不是你的具体问题,但

之间存在重大差异
Dim X = New Y()

Dim X As Y = New Y()

这里的差异实际上取决于您使用的VB.NET版本。


VB.NET 7& 8

Dim X = New Y()

这将X定义为objectSystem.Object)类型的变量,然后创建Y类型的对象并将其分配给X。请注意,当您定义Option Strict Off时,此有效,否则甚至无法编译。它实际上只是VB6及更早版本语法的结转,而且通常不鼓励。

Dim X as Y = New Y()

这完全相同,只是X现在是强类型的,换句话说它是Y而不是object(所有类型都从中继承,包括值)盒装时的类型)。

VB.NET 9,随后

Dim X = New Y()

这里的差异(对于较新版本的VB.NET)是type inference在这里生效。因为您没有指定任何类型,但是编译器很明显New Y()返回类型为Y的实例,它会自动推断出X的类型应为{{1}这比对象更具体。类型干扰也适用于更复杂的表达式。

Y

这与在VB.NET 7&中完全相同。 8。


总而言之,您可以有效地替换

Dim X as Y = New Y()

Dim X As New Y()
在VB.NET 9中,

由于类型推断,编译器会将两行完全相同。但是,在早期版本中,第二行将是弱类型(类型为Dim X = New Y() ),这是不可取的。同样,这不是问题的直接答案,但我认为这可能有助于指出。

答案 2 :(得分:3)

没有区别。 VB.NET提供:

Dim X As New Y

在语法上与旧的VB6声明语法兼容。