VB.NET语言和没有:为什么它是这样的?

时间:2009-06-23 19:29:26

标签: .net vb.net compiler-construction

这是一个关于VB.NET语言的问题。由于我每天都在使用它,我只是试着理解它的一些结构背后的动机。

我发现这一行:

If myObject Is Nothing then

正确如下:

If Nothing Is myObject Then

相同的结果。使用ildasm,我们可以看到这些行被转换为:

if myObject = null then

if null = myObject then

嗯,但是,在VB.NET中,你不能写:

if myObject = Nothing Then

编译器不会接受。

嗯,对我来说, 如果没有myObject 更不明显,如果myObject = Nothing

为什么VB.NET作者只是反思?任何提示?

5 个答案:

答案 0 :(得分:25)

您遇到的问题是VB.Net区分了两种类型的对象比较。即参考和价值比较。

VB.Net中的“Is”运算符用于参考比较。当有问题的值既是引用类型也可以是nullables时,可以使用此方法。尝试比较值类型,这种方式将导致编译错误。

“=”运算符用于值比较。值比较只能用于定义显式=,<>的类型。运算符对在他们的类定义中。平等的实际实现取决于运营商的实施。

C#采用不同的方法,因为它使用==进行值和参考比较。使用哪一个取决于几个因素,包括被比较的值的类型和某些平等方法的实现。

答案 1 :(得分:4)

这是继承自VB6和COM的其中一项。 VB6区分了引用类型对象(可实例化)和本机类型(如int)。必须使用“Set”运算符创建和分配引用类型,而本机类型只使用“=”。

答案 2 :(得分:3)

嗯,在某些情况下,您可以编写If myObject = Nothing Then,但它不会是空比较:

Dim someValue As Integer
If someValue = Nothing Then
    ' do something '
End If

以上代码相当于以下内容:

Dim someValue As Integer
If someValue = 0 Then
    ' do something '
End If

在这种情况下,您的值类型具有“emtpy”值(Integer为0,Point结构为Point.Empty作为示例。 Is运算符执行引用比较(检查比较的对象是否是同一个实例),而等号是值比较

答案 3 :(得分:1)

Is Nothing的使用是一个可以追溯到经典Visual Basic(即6.0及以下)时代的构造。

为了保持一些兼容性(就像VB6处理If语句的非惰性求值的方式),这已被转移到VB.NET中。

幸运的是,ocdecio指出,还有其他类似的peccadillos没有被转移到VB.NET中,例如用于将对象分配给变量的Set语句。

答案 4 :(得分:1)

另一个想法是,如果你看一些循环和条件语法,VB意图更加冗长。几个例子:

VB:

If x==0 Then
End If

While 
End While

For i = 0 to 10 Step 2
Next i

C#

 If x==0 
 {
 }

 While 
 {
 }

 for (int i = 0; i<=10;i+2)
 {
 }

查看VB.Net代码中的所有额外单词?这是产生差异的另一个可能原因。