区分空值和空值的最有效方法是什么?我想要:
CStr("")
到True
,而CStr(Nothing)
到False
HasValue
属性用于可空值类型。对于引用类型(String
是引用类型,与所有类一样),您只需与Nothing
进行比较:
If myString Is Nothing Then
请注意使用Is
运算符。这是为了引用相等,而=
运算符用于值相等。大多数类型只支持其中一种,但String
是支持两者的少数类型之一,因为它们都有意义。试试这个,看看它们各自的表现如何:
Dim nullString As String = Nothing
Dim emptyString As String = String.Empty
If nullString Is Nothing Then
Console.WriteLine("nullString Is Nothing")
End If
If nullString = Nothing Then
Console.WriteLine("nullString = Nothing")
End If
If nullString Is String.Empty Then
Console.WriteLine("nullString Is String.Empty")
End If
If nullString = String.Empty Then
Console.WriteLine("nullString = String.Empty")
End If
If emptyString Is Nothing Then
Console.WriteLine("emptyString Is Nothing")
End If
If emptyString = Nothing Then
Console.WriteLine("emptyString = Nothing")
End If
If emptyString Is String.Empty Then
Console.WriteLine("emptyString Is String.Empty")
End If
If emptyString = String.Empty Then
Console.WriteLine("emptyString = String.Empty")
End If
引用相等性检查两个引用是否引用同一个对象,而值相等性检查两个值是否相等,而不管它们是什么对象。 Nothing
和String.Empty
在引用相等的上下文中并不相同,因为一个是对象,一个不是对象,但它们在值相等的上下文中被认为是等价的。
这里是:
<Runtime.CompilerServices.Extension>
Public Function HasValue(s As String)
Return TypeOf (s) Is String
End Function
稍微好一点:(来自jmcilhinney的回答)
<Runtime.CompilerServices.Extension>
Public Function HasValue(s As String)
Return s IsNot Nothing
End Function
也是10000种不同长度字符串的各种方法的基准:
函数(x As String)..............:总时间(rel效率%)
TypeName(x)=“String”.....................:0.850ms(17.1%)
VarType(x)= VariantType.String ........:0.590ms(24.6%)
TypeOf(x)是字符串...........................:0.150ms(96.7%)
x IsNot Nothing .................................:0.145ms(100%)