Nothing = String.Empty(为什么这些相等?)

时间:2010-04-13 21:01:31

标签: vb.net string nothing

为什么第一个if语句评估为true?我知道如果我使用“是”而不是“=”那么它将不会评估为真。如果我将String.Empty替换为“Foo”,则它不会评估为true。 String.Empty和“Foo”都有相同类型的String,那么为什么一个评估为true而另一个不评估?

    //this evaluates to true
    If Nothing = String.Empty Then

    End If

    //this evaluates to false
    If Nothing = "Foo" Then

    End If

4 个答案:

答案 0 :(得分:20)

VB.net中没有任何内容是类型的默认值。 language spec在第2.4.7节中说明了

  

没有什么是特殊的文字;它没有类型,可以转换为类型系统中的所有类型,包括类型参数。转换为特定类型时,它等效于该类型的默认值。

因此,当你对String.Empty进行测试时,Nothing被转换为一个长度为0的字符串.Is运算符应该用于测试Nothing,而String.Empty.Equals(Nothing)也将返回false

答案 1 :(得分:7)

这是VB =<>运营商的一个特例。

第11.14节中的Language Specification州:

  

进行字符串比较时,空引用等同于字符串文字&#34;&#34;。

如果您对更多详细信息感兴趣,我在VB.NET中对vbNullStringString.Empty""Nothing进行了深入比较:< / p>

答案 2 :(得分:2)

试试这个:

Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))

=运算符不强制执行相同的类型,而字符串对象的.Equals()方法与Is运算符一样。

答案 3 :(得分:2)

与此主题相关,如果您使用初始化为“nothing”的字符串变量分配给SqlParameter的属性“value”,该参数将被忽略,不包含在发送到服务器的命令中,并且缺少参数错误被抛出。 如果用string.empty初始化该变量,一切都会顺利。

//This doesn't work
Dim myString as String = nothing
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString

//This works    
Dim myString as String = string.empty
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString