【问题标题】:Nothing = String.Empty (Why are these equal?)Nothing = String.Empty(为什么它们相等?)
【发布时间】:2010-04-13 21:01:30
【问题描述】:

为什么第一个 if 语句的计算结果为 true?我知道如果我使用“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

【问题讨论】:

  • 你是用.Equals()的方法来比较的吗?
  • 我添加了一个代码sn-p。我实际上不需要在 null 和空字符串之间进行比较,我只是好奇为什么该语句评估为 true。
  • Nothing=String.EmptyString.Empty != Nothing。我刚刚发现了这个

标签: vb.net string nothing


【解决方案1】:

VB.net 中没有任何东西是类型的默认值。 language spec 在第 2.4.7 节中说:

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

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

【讨论】:

  • 当对字符串使用 = 运算符时,VB.NET 使用 StrCmp,而不是 op_Equality。我推测这是出于向后兼容性的原因。
  • 她的意思是:VB.NET Nothing = default(T) in C#, not NULL
  • 但是String的默认值不是Nothing而不是""吗?
  • @recursive:是的。这也适用于 VB。主要答案是不正确的,真正的原因在 Rebecca 的评论中给出:当您将字符串与 = 进行比较时,VB.NET 会调用 StrCmp。这个方法有特殊的代码来处理 "" = Nothing 为真。如果你尝试 "".Equals(Nothing) 你会得到错误的。
  • @RebeccaChernoff 这个答案完全具有误导性:default(String)null,而不是 String.Empty,因为 String 是 ref 类型。正确答案是来自 Heinzi 的答案,或者在您对 StrCmp 的评论中。请修改您的答案,以供将来参考。
【解决方案2】:

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

第 11.14 节中的 Language Specification 状态:

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


如果你对更多细节感兴趣,我在这里写了一个在VB.NET中vbNullStringString.Empty""Nothing的深入比较:

【讨论】:

【解决方案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

【讨论】:

  • 将值设置为 DBNull.value 而不是什么都没有
  • 指出一个问题,如果外部库不是用VB编写的,那么库的作者可能没有意识到VB中空字符串和空字符串之间的歧义。所以当它在VB代码中使用时,用户必须小心不传递任何内容或空字符串。
  • VB 中NothingString.Empty 之间没有歧义。他们比较真实,但他们不一样。将Nothing 作为参数值传递会导致根本不发送参数,C# 中的null 也是如此。传递DBNull.Value 会导致数据库null 作为参数值发送,在C# 中也是如此。传递"" 会导致将一个空字符串发送到数据库,在 C# 中也是如此。
【解决方案4】:

试试这个:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 2018-05-29
    • 2011-03-09
    • 2019-10-24
    • 2013-08-18
    • 2011-04-03
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多