繁体   English   中英

VB.NET语言与Nothing:为什么这样呢?

[英]VB.NET language and Nothing : why is it the way it is?

这是有关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 = Nothing那么If Nothing Is myObject就不那么明显。

为什么VB.NET作者只是相反呢? 有什么提示吗?

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

VB.Net中的“ Is”运算符用于参考比较。 当所涉及的值都是引用类型或可为空值时,可以使用此方法。 尝试以这种方式比较值类型将导致编译错误。

“ =”运算符用于值比较。 值比较只能用于在其类定义中定义了显式=,<>运算符对的类型上。 相等性的实际实现取决于运算符的实现。

C#采用另一种方法,因为它使用==进行值和引用比较。 使用哪种方法取决于几个因素,包括要比较的值的类型以及某些相等方法的实现。

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

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

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

上面的代码等效于以下代码:

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

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

Is Nothing的使用可以追溯到经典Visual Basic的版本(即6.0及更低版本)。

为了保持兼容性的相似性(就像VB6处理If语句的非延迟评估的方式一样),这已被带到VB.NET中。

幸运的是,正如ocdecio所指出的那样,还有一些其他类似的peccadillos尚未被带入VB.NET,例如用于将对象分配给变量的Set语句。

另一个想法是,如果您查看一些循环和条件语法,则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代码中的所有多余单词吗? 这是造成差异的另一个可能原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM