这是一个关于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作者只是反思?任何提示?

有帮助吗?

解决方案

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

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

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

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

其他提示

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

嗯,在某些情况下你可以写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

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

另一个想法是,如果你看一些循环和条件语法,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代码中的所有额外单词?这是产生差异的另一个可能原因。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top