27

为什么第一个 if 语句评估为真?我知道如果我使用“is”而不是“=”,那么它不会评估为真。如果我用“Foo”替换 String.Empty,它不会评估为真。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

4 回答 4

23

VB.net 中的任何内容都不是类型的默认值。语言规范在第2.4.7 节中说:

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

因此,当您针对 String.Empty 进行测试时,Nothing 会转换为长度为 0 的字符串。Is 运算符应该用于针对 Nothing 进行测试,并且 String.Empty.Equals(Nothing) 也将返回 false。

于 2010-04-13T21:16:39.060 回答
14

=这是 VB和运算符的特例<>

语言规范在第11.14 节中指出:

在进行字符串比较时,空引用等同于字符串文字“”。


vbNullString如果您对更多细节感兴趣,我在这里写了,String.Empty和VB.NET""的深入比较:Nothing

于 2015-12-03T15:02:44.883 回答
3

与本主题相关,如果使用以“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
于 2011-01-11T15:15:01.727 回答
2

试试这个:

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

=运算符不强制使用相等的类型,而字符串对象的方法.Equals()Is运算符一样。

于 2010-04-13T21:16:47.527 回答