如何区分 .NET 中的空字符串和零长度字符串?
How to discriminate between null and zero length string in .NET?
区分空值和空值的最有效方法是什么?我想:
- 在
str=""
时将 CStr(str)
计算为 True
,而
- 当
str=Nothing
时将 CStr(str)
计算为 False
这里是:
<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 作为字符串).................:[=28=]总时间 (相对效率 %)
TypeName(x) = "String".......:0.850ms (17.1%)
VarType(x) = VariantType.String.......:0.590ms (24.6%)
TypeOf (x) 是字符串.......................:0.150ms (96.7%)
x 不是什么.................................:0.145 毫秒 (100%)
HasValue
属性 适用于可为 null 的值类型。对于引用类型(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
在引用相等的上下文中不是一回事,因为一个是对象,一个不是对象,但在值相等的上下文中它们被认为是等价的。
区分空值和空值的最有效方法是什么?我想:
- 在
str=""
时将CStr(str)
计算为True
,而 - 当
str=Nothing
时将
CStr(str)
计算为 False
这里是:
<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 作为字符串).................:[=28=]总时间 (相对效率 %)
TypeName(x) = "String".......:0.850ms (17.1%)
VarType(x) = VariantType.String.......:0.590ms (24.6%)
TypeOf (x) 是字符串.......................:0.150ms (96.7%)
x 不是什么.................................:0.145 毫秒 (100%)
HasValue
属性 适用于可为 null 的值类型。对于引用类型(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
在引用相等的上下文中不是一回事,因为一个是对象,一个不是对象,但在值相等的上下文中它们被认为是等价的。