在 VB.NET 中,下列两种定义方式有何不同:
if foo is Nothing Then
doStuff()
End If
和
if foo=Nothing Then
doStuff()
End If
更新我收到了以下回答:
foo is Nothing
简单地检查foo
是否未分配给任何引用。foo = Nothing
检查由foo
持有的引用是否等于nothing
。
运行这三个语句后,
Dim foo as Object
Dim bar as Integer
foo = bar
foo is Nothing
求值为假,foo = Nothing
求值为真。
但是,如果将 bar
声明为一个未初始化的 Object
,那么 foo is Nothing
和 foo = Nothing
都会求值为真!我认为这是因为 Integer
是值类型而 Object
是引用类型导致的。
=
会调用一个特殊的方法而不是Equals
,这个方法将把Nothing
视为空字符串。 - Konrad Rudolphfoo = Nothing
会编译通过,但这会得到错误的答案。 - Jonathan AllenNullable(Of T)
是一个值类型,我的回答仍然适用。foo = Nothing
将 给出正确的答案,并且它等同于Not foo.HasValue
。 - Konrad RudolphIf
是多余的:当然,foo
将始终为Nothing
,因为它已经被初始化,并且从未更改过。编译器足够聪明,可以弄清楚这一点,但这与可空类型的可比性无关。如果你不相信我,只需尝试Dim foo As Integer? = 1
或Dim foo As Integer? = If(New Random().NextDouble() < 0.5, 1, CType(Nothing, Integer?))
- 这模拟了一个抛硬币的过程,所以编译器无法猜测foo
的值。 - Konrad Rudolph