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 Nothingfoo = Nothing均评估为true!我认为这是因为Integer是值类型,而Object是引用类型。

最佳答案

这取决于类型。

  • 对于值类型Is不起作用,仅=Nothing引用该类型的默认实例(即,通过为给定类型New T()调用T获得的实例)。
  • 对于引用类型Is执行引用比较(与object.ReferenceEquals(a, Nothing)相同)。 a = Nothing通常不起作用,通常不起作用,除非已为该类明确定义了 Operator =
    此外,如果Operator =已正确实现,则foo = Nothingfoo 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/

    10-11 18:37