为什么Nothing字符串不引起异常? (BC42104)

时间:2019-03-27 18:51:23

标签: vb.net

如果我声明了一个字符串但未分配值,则Equals函数将引发异常,但如果将其与值进行比较,则不会引发异常。

错误列表警告该问题:

  

警告BC42104变量a在分配前已使用   值。空引用异常可能会在运行时导致。

Dim a As String
Dim b as string = "bar"

a.Equals("foo") 'causes System.NullReferenceException

a = "foo" 'No exception although a is nothing

a = b 'No exception although a is nothing

我知道警告说它可能会引起异常,但是有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

这是因为Dim a As String声明了变量a的类型,但未为其分配任何内容。基本上是这样说的:“使此变量保存String对象,但现在不保存任何对象”。另一方面,Dim b As String = "bar"声明变量及其类型,但还为其分配一个String对象(“ bar”)。 a.Equals("foo")返回异常的原因是,您仅声明了它,而没有为其分配任何内容(因此,您尝试访问的对象不存在)。 a = "foo"之所以有效,是因为您正在为变量a分配值“ foo”的String对象。就像说:“此变量现在包含一个值为'foo'的String对象”。

编辑:

虽然您的代码指向变量a的赋值,但我意识到您想知道=运算符(作为比较运算符)为何起作用。这是因为我之前所说的内容不包含任何对象时并不完全正确。如果未分配任何String对象(String是可为空的对象),则它实际上是Nothing值(将其设置为null引用)。

请参阅:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/nothing

希望这会有所帮助。