在VB.NET中,有什么区别
if foo is Nothing Then
doStuff()
End If
和
if foo=Nothing Then
doStuff()
End If
更新我收到以下答案:
运行这三个语句后,
Dim foo as Object
Dim bar as Integer
foo = bar
foo is Nothing
评估为false,而foo = Nothing
评估为true。但是,如果将
bar
声明为Object
且未初始化,则foo is Nothing
和foo = Nothing
均评估为true!我认为这是因为Integer
是值类型,而Object
是引用类型。 最佳答案
这取决于类型。
Is
不起作用,仅=
和Nothing
引用该类型的默认实例(即,通过为给定类型New T()
调用T
获得的实例)。Is
执行引用比较(与object.ReferenceEquals(a, Nothing)
相同)。 a = Nothing
通常不起作用,通常不起作用,除非已为该类明确定义了 Operator =
。此外,如果
Operator =
已正确实现,则foo = Nothing
和foo Is Nothing
应该产生相同的结果(但对于Nothing
而言,其他任何值都不相同),但是foo Is Nothing
会更高效,因为它是编译器固有的,而Operator =
将调用一个方法。Nullable(Of T)
的实例),适用特殊规则:像所有其他运算符一样,=
是lifted(请注意该博客文章中的错误…),编译器将其指定为基础类型。因此,比较两个Nullable
的结果不是Boolean
而是Boolean?
(请注意?
)。但是,由于提升了运算符的所谓的“空传播”,无论Nothing
的值如何,此操作始终将返回foo
。引用Visual Basic 10 language specification(第1.86.3节):因此,如果用户希望将
Nullable
变量与Nothing
进行比较,则他们必须使用foo Is Nothing
语法,编译器会再次为其生成特殊代码以使其起作用(Visual Basic 10语言规范的第1.79.3节)。向乔纳森·艾伦(Jonathan Allen)表示感谢(正确)坚持认为我错了;给Jared Parsons的提示,向我传递了指向Visual Basic 10规范的链接。
(上面的代码假设您一如既往地使用了
Option Strict On
。在这种情况下,由于调用foo = Nothing
可能会执行后期绑定(bind)调用,因此结果会略有不同。)关于vb.net - VB.NET中的 'foo = Nothing'和 'foo is Nothing'有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3118283/