这是一个关于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作者只是反思?任何提示?
答案 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代码中的所有额外单词?这是产生差异的另一个可能原因。