vbNullString,String.Empty和""之间有什么区别?

4 vb.net string-comparison

所有这些

  • txtUsername.Text <> vbNullString
  • txtUsername.Text <> String.Empty
  • txtUsername.Text <> ""

似乎返回相同的结果.那么vbNullString,String.Empty和之间的区别是""什么?

Hei*_*nzi 17

有什么不同?

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

  • 与声称" [r]表示零长度字符串 " 的文档相反,实际上是(在C#中,参见参考源).vbNullStringvbNullStringNothingnull

(请注意,这仅适用于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
Run Code Online (Sandbox Code Playgroud)

因此,Not String.IsNullOrEmpty(s),s <> "",s <> String.Emptys <> vbNullString都是等效的.我更喜欢简洁s <> "",但主要是偏好和风格的问题.

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

一般来说:没有.一个空字符串,并没有任何的这种等价是唯一真正的VB.NET的内置=<>运营商以及最的方法Microsoft.VisualBasic命名空间(Len(...),Trim(...),...).一旦进入纯.NET领域(例如,通过使用其他基类库中的方法),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
Run Code Online (Sandbox Code Playgroud)

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

向后兼容性.在VBA(和"VB Classic")中,vbNullString可以用来获得"空字符串引用"¹.在VBA中,vbNullString被视为空字符串"",但在与非VB代码交互时,vbNullString被映射到NULL指针""并被映射到空字符串.

在VB.NET中使用PInvoke时,Nothing映射到NULL指针并""映射到空字符串,因此在VB.NET中使遗留常量vbNullString相等是有意义的Nothing.


¹这是VBA的完全不同的NullEmpty,这是特殊的Variant亚型,和VBA的Nothing,这在VBA,仅适用于对象,而不是字符串.


Dom*_* B. 8

vbNullString是一个常量,更可能是在VB6之外,String.Empty并且""是相同的,有人说有性能差异,但事实并非如此,它是你选择使用的.

要检查字符串是否为空,您可以使用If String.IsNullOrEmpty(String).优点是它也会检查null,因为string是一个类,因此是一个引用类型.