vbNullString、String.Empty和""有什么区别?

11
所有这些
  • txtUsername.Text <> vbNullString
  • txtUsername.Text <> String.Empty
  • txtUsername.Text <> ""
看起来返回的结果都是相同的。那么,vbNullStringString.Empty""之间有什么区别呢?

2
IsNullOrEmpty()怎么样? - Arman
2
Arman 的意思是 String.IsNullOrEmpty() - Sam Axe
3个回答

26

有何区别?

  • String.Empty"" 都表示长度为零的字符串。

  • 文档所述相反,声称vbNullString"表示长度为零的字符串",实际上vbNullStringNothing(在C#中为null,请参见参考源代码)。

(请注意,这仅适用于VB.NET!在VBA中情况不同,请参阅下面的详细信息。)

那么如何检查字符串是否为 null/Nothing 或为空?

与其他答案所说的不同,您不需要使用String.IsNullOrEmpty来检查Nothing或空字符串,因为在Visual Basic中= 运算符将 Nothing 和空字符串视为等效。因此,在VB.NET中检查“null或空字符串”的习惯方式是简单地使用= ""

Dim s As String = Nothing
If s = "" Then Console.WriteLine("YES")     ' Prints YES
因此,Not String.IsNullOrEmpty(s), s <> "", s <> String.Emptys <> vbNullString 都是等价的。我更喜欢简洁的 s <> "",但这主要是个人偏好和风格问题。

这是否意味着我可以将空字符串和Nothing互换使用?

一般而言:不行。空字符串和Nothing之间的等价只适用于VB.NET内置的=<>运算符以及Microsoft.VisualBasic命名空间中的大多数方法(例如Len(...)Trim(...)等)。一旦你进入了纯.NET领域(例如使用来自Base Class Library的方法),Nothing和空字符串就会被区别对待:
Dim sNothing As String = Nothing
Dim sEmpty As String = ""

Console.WriteLine(sEmpty = sNothing)                ' True
Console.WriteLine(sEmpty.Equals(sNothing))          ' False
Console.WriteLine(String.Equals(sEmpty, sNothing))  ' False

Console.WriteLine(Len(sEmpty))                      ' 0
Console.WriteLine(Len(sNothing))                    ' 0
Console.WriteLine(sEmpty.Length)                    ' 0
Console.WriteLine(sNothing.Length)                  ' throws a NullReferenceException

为什么将vbNullString定义为Nothing而不是""

向后兼容。在VBA(和“VB经典”)中,vbNullString可以用于获取“null字符串引用¹”。在VBA中,vbNullString被视为空字符串"",但在与非VB代码交互时, vbNullString被映射到NULL指针,""被映射到空字符串

在使用VB.NET中的PInvoke时,Nothing被映射到NULL指针,""被映射到空字符串,因此在VB.NET中使旧版常量vbNullString等于Nothing是有意义的。


¹ 这完全不同于VBA的NullEmpty,它们是特殊的Variant子类型,以及VBA的Nothing,在VBA中只适用于对象而不适用于字符串。


我之前没有意识到 vbNullString 等于 Nothing。谢谢你指出来!文档有些矛盾,因为它实际上也表明这是一个被定义为 Nothing 的常量:public const string vbNullString = null; - Ama

8

vbNullString是一个常量,更可能出现在VB6中,而String.Empty""是相同的,有些人说它们之间存在性能差异,但是这并不是真的,你可以自由选择使用哪一个。

要检查一个字符串是否为空,你可以使用If String.IsNullOrEmpty(String)。优点是它也会检查null,因为字符串是一个类,并且因为这个原因是一个引用类型。


1
如果要向 MS-SQL 数据库插入值,并且如果列不允许为空(非空),那么 strValue=vbNullString 将生成异常,但 strValue="" 将插入空格。

1
这只是一个非常具体的案例,说明了vbNullString = Nothing这一事实的后果,如此答案所述... - Mathieu Guindon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接