if foo is Nothing Then doStuff() End If
和
if foo=Nothing Then doStuff() End If
更新我收到以下答案:
foo is Nothing
simply checks iffoo
is not assigned to any reference.
foo = Nothing
checks if the reference held byfoo
is equal tonothing
.
运行三个语句后,
Dim foo as Object Dim bar as Integer foo = bar
foo是Nothing的计算结果为false,而foo = Nothing的计算结果为true.
但是,如果bar被声明为Object而未初始化,则foo为Nothing,foo = Nothing都为true!我认为这是因为Integer是一个值类型而Object是一个引用类型.
>对于值类型,Is不起作用,只有=,Nothing引用该类型的默认实例(即通过为给定类型T调用New T()获得的实例).
>对于引用类型,Is执行引用比较(与object.ReferenceEquals(a,Nothing)相同). a =除非为该类明确定义了Operator =,否则通常什么都不起作用.
此外,如果Operator =已经正确实现,那么foo = Nothing和foo Is Nothing应该产生相同的结果(但是对于任何其他值而不是Nothing都是如此)但是foo是没有什么会更有效,因为它是当运算符=将调用方法时编译器内在.
>对于可空值的类型(即Nullable(Of T)的实例),特殊规则适用:与所有其他运算符一样,编译器对基础类型= lifted(注意该博客文章中的错误…).比较两个Nullables的结果因此不是布尔值而是布尔值? (注意?).但是,由于提升运算符的所谓“空传播”,无论foo的值如何,都将返回Nothing.引用Visual Basic 10 language specification(§1.86.3):
If ether (sic!) operand is
Nothing
,the result of the expression is a value ofNothing
typed as the nullable version of the result type.
因此,如果用户想要将Nullable变量与Nothing进行比较,则必须使用foo Is Nothing语法,编译器再次生成特殊代码以使其工作(Visual Basic 10语言规范的§1.79.3).
向Jonathan Allen提示(正确)坚持说我错了;向Jared Parsons提示给我一个Visual Basic 10规范的链接.
(上面假设使用了Option Strict On,因为你总是应该这样.如果不是这种情况,结果会略有不同,因为调用foo = Nothing可能会执行后期绑定调用.)