为什么第一个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
答案 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中对vbNullString
,String.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