有何区别?
(请注意,这仅适用于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.Empty
和
s <> 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的Null
和Empty
,它们是特殊的Variant
子类型,以及VBA的Nothing
,在VBA中只适用于对象而不适用于字符串。
IsNullOrEmpty()
怎么样? - ArmanString.IsNullOrEmpty()
。 - Sam Axe