gpt4 book ai didi

vb.net - VB.NET 中的 'foo = Nothing' 和 'foo is Nothing' 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 03:05:49 25 4
gpt4 key购买 nike

VB.NET , 有什么区别

if foo is Nothing Then
doStuff()
End If


if foo=Nothing Then
doStuff()
End If

更新我收到了以下答案:

foo is Nothing simply checks if foo is not assigned to any reference. foo = Nothing checks if the reference held by foo is equal to nothing.



运行这三个语句后,
Dim foo as Object
Dim bar as Integer
foo = bar
foo is Nothing计算结果为 false 和 foo = Nothing评估为真。

但是,如果 bar被声明为 Object并且没有初始化,然后 foo is Nothingfoo = Nothing两者都评估为真!我想这是因为 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 的结果因此 s 不是 Boolean但是 Boolean? (注意 ? )。但是,由于提升运算符的所谓“空传播”,这将始终返回 Nothing , 无论 foo 的值如何.引用 Visual Basic 10 language specification (§1.86.3):

    If ether (sic!) operand is Nothing, the result of the expression is a value of Nothing 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 可能会执行后期绑定(bind)调用。)

    关于vb.net - VB.NET 中的 'foo = Nothing' 和 'foo is Nothing' 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118283/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com