2010-04-13 81 views
24

为什么第一个if语句的结果为true?我知道如果我使用“是”而不是“=”,那么它不会评估为真。如果我用“Foo”替换String.Empty,它不会计算为true。 String.Empty和“Foo”都具有相同类型的字符串,那么为什么一个评估为真,另一个不是?Nothing = String.Empty(为什么它们相等?)

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

    End If 

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

    End If 
+0

您是否在使用'.Equals()'方法进行比较? – Amber 2010-04-13 21:14:44

+0

我添加了一个代码片段。实际上我并不需要在null和空字符串之间进行比较,我只是很好奇为什么该语句的计算结果为true。 – 2010-04-13 21:25:44

回答

21

VB.net中没有什么是类型的默认值。 language spec在2.4.7节中说:

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

所以,当你测试针对的String.Empty,没有什么是转换为字符串,其长度为0的是运营商应当用于对没有测试,String.Empty.Equals(没有)会也返回false。

+0

您是否知道在比较时自动将Nothing转换为字符串的原因?这有什么好处? – 2010-04-13 21:24:29

+8

将=运算符与字符串一起使用时,VB.NET使用StrCmp而不是op_Equality。我推测这是出于向后兼容性的原因。 – 2010-04-13 21:51:48

+1

她的意思是说:VB.NET Nothing =默认(T)在C#中,而不是NULL – 2013-01-18 05:54:01

2

尝试这种情况:

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

=操作者不执行等于类型,而字符串对象的.Equals()方法不一样,在操作者Is

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 
+0

就在我认为我理解VB.NET时... – 2013-11-18 19:05:59

+2

将值设置为DBNull.value而不是Nothing – 2014-01-29 21:49:57

+0

它指出了一个问题,即如果外部库不是用VB编写的,库的作者可能不知道VB中没有任何内容和空字符串之间的歧义。因此,当它用于VB代码时,用户必须小心地传递任何内容或空字符串。 – Gqqnbig 2016-09-15 17:29:09

4

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

在第11.14 Language Specification状态:

当执行字符串比较,空引用等同于字符串“”。

相关问题