[英]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.