所有这些
txtUsername.Text <> vbNullString
txtUsername.Text <> String.Empty
txtUsername.Text <> ""
似乎返回相同的结果。那么,vbNullString
,String.Empty
和""
之间的区别是什么?
答案 0 :(得分:16)
//public override void Draw(CGRect rect)
//{
// base.Draw(rect);
//}
和String.Empty
都代表一个长度为零的字符串。
与the documentation相反,Reference Source声称""
“ [r]表示零长度字符串”,vbNullString
实际上是{{ 1}}(C#中的vbNullString
,请参阅vbNullString
was mapped to the NULL pointer and ""
was mapped to an empty string)。
(请注意,这仅适用于VB.NET!VBA的情况有所不同,详见下文。)
与其他答案所说的相反,您不需要使用Nothing
来检查null
或空字符串,因为Visual Basic中的String.IsNullOrEmpty
运算符会处理Nothing和空字符串等效。因此,在VB.NET中检查“null或空字符串”的惯用方法是简单地使用Nothing
:
=
因此,= ""
,Dim s As String = Nothing
If s = "" Then Console.WriteLine("YES") ' Prints YES
,Not String.IsNullOrEmpty(s)
和s <> ""
都是等效的。我更喜欢简洁的s <> String.Empty
,但它主要是偏好和风格的问题。
一般来说:没有。空字符串和Nothing的等效性仅适用于VB.NET的内置s <> vbNullString
和s <> ""
运算符以及=
命名空间中的大多数方法({{1} },<>
,...)。一旦进入纯.NET领域(例如,通过使用其他基类库中的方法),Nothing和空字符串将被区别对待:
Microsoft.VisualBasic
Len(...)
定义为Trim(...)
而不是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
?向后兼容性。在VBA(和“VB Classic”)中,vbNullString
可用于获取“空字符串引用”¹。在VBA中,Nothing
被视为空字符串""
,但在与非VB代码进行交互时,{{3}}。
在VB.NET中使用PInvoke时,vbNullString
被映射到NULL指针,而vbNullString
被映射到空字符串,因此将遗留常量""
相等是有意义的VB.NET中的Nothing
。
¹与VBA的""
和vbNullString
(特殊Nothing
子类型)和VBA Null
完全不同,VBA的Empty
仅适用于对象和不要串。
答案 1 :(得分:7)
vbNullString是一个常量,更可能是在VB6之外,String.Empty
和""
是相同的,有人说有性能差异,但事实并非如此,这是你的选择你的选择使用
要检查字符串是否为空,您可以使用If String.IsNullOrEmpty(String)
。优点是它还会检查 null ,因为string是一个类,因此是一个引用类型。