如果我声明了一个字符串但未分配值,则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
我知道警告说它可能会引起异常,但是有人知道为什么会这样吗?
答案 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
希望这会有所帮助。