Dim X as New Y 与 Dim X as Y = New Y() 的区别

5
3个回答

13

第一个(示例)只是推断类型为Y。而第二个则明确指定类型为Y。这使你可以写出类似以下的代码:

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

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

当然,更短的版本确实有简洁的好处——如果您具有非常长的类型名称(例如使用嵌套泛型),这可能非常重要。对于匿名类型,它也是必需的,因为您无法表达 X 的类型。


8

Jon Skeet已经提供了正确的答案,但我想再加一点额外的内容...

虽然这不是你特别问的问题,但有一个重要的区别:

Dim X = New Y()

并且

Dim X As Y = New Y()

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

VB.NET 7 & 8

Dim X = New Y()

这段代码定义了X作为类型为object (System.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)在于类型推断正在生效。因为您没有指定任何类型,但编译器明显可以看出New Y()返回了一个类型为Y的实例,它自动推断X的类型应该是Y,这比object更具体。类型推断也适用于更复杂的表达式。
Dim X as Y = New Y()

这是以与VB.NET 7和8完全相同的方式解释的。

总之,您可以有效地替换

Dim X As New Y()

使用

Dim X = New Y()

在VB.NET 9中,编译器会通过类型推断将这两行代码解释为完全相同的内容。然而,在早期版本中,第二行代码将是弱类型的(类型为“object”),这是不可取的。虽然这不是对问题的直接回答,但我认为指出这一点可能会有所帮助。

1
嗯,我相当确定你是错误的,VS 2005中的Dim x as new Y会给你一个强类型对象。我相当肯定它一直都是这样,一直到最早版本的.NET(但我没有别的东西可以依赖,我这里没有安装比2005更旧的版本)。 - Binary Worrier
好的,我在这里误读了问题。我的答案对于问题“Dim X = New Y vs. Dim X as Y = New Y()”是正确的(即用=替换as)。我已经编辑了帖子以反映所有这些内容。 - Noldorin
这个踩的不是我,你的评论“用=代替as”很有道理,我们两个都在密谋让我困惑死 :) - Binary Worrier
1
@Binary Worrier:嘿嘿,是的。我觉得我一开始搞混了自己,至少是因为读错了。感谢你的支持。 @Bob King:是的,说得好。我记得这个语法是从VB6继承来的,但确实需要关闭Option Strict才能使其工作。 - Noldorin
@Bob:干杯。是的,所有版本的VB都支持该语法。我不认为我有反驳这一点,但如果你愿意,我也可以澄清一下这个观点。 - Noldorin
显示剩余4条评论

3

没有区别。VB.NET 提供了以下特点:

Dim X As New Y

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

1
又被 Skeet 打败了,唉。 - Justin Niessner
我更喜欢这个答案,因为它是两个问题中唯一的一个,也显示出后者实现较新,因此可能更适合未来和更标准化的.NET方式 - 这意味着我将坚持使用它。 - Toby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接