如何区分 .NET 中的空字符串和零长度字符串?

Posted

技术标签:

【中文标题】如何区分 .NET 中的空字符串和零长度字符串?【英文标题】:How to discriminate between null and zero length string in .NET? 【发布时间】:2018-12-26 01:27:39 【问题描述】:

区分空值和空值的最有效方法是什么?我想:

    str="" 时将CStr(str) 评估为True,而 当str=Nothing 时将CStr(str) 评估为False

【问题讨论】:

我不确定,这是个问题吗? Stack Overflow 支持并鼓励回答您自己的问题以帮助其他用户。问题是如何区分空字符串和零长度字符串。在将字符串传递给函数时避免错误很有用。 绝对不重复。问题是关于区分 CStr(nothing) 和 CStr("")。 但是,如果您的要求仍然是能够编写类似If(str.HasValue, str, "") 的东西,那么答案仍然只是If(str,""),这就是关于该问题的各种答案都这么说的。 不,我的要求是检查字符串“”是否作为可选参数传递给函数,或者什么都不传递。由于这种误解,我获得了如此多的反对票和重复标记。这是我的问题中的这个误导性示例......我更正了它。 【参考方案1】:

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

引用相等检查两个引用是否引用同一个对象,而值相等检查两个值是否相等,不管它们是什么对象。 NothingString.Empty 在引用相等的上下文中不是一回事,因为一个是对象,一个不是对象,但在值相等的上下文中它们被认为是等价的。

【讨论】:

你是对的:myString Is Nothing 没问题。我的回答也有效 我不知道myString Is Nothing返回的结果与myString = Nothing不同【参考方案2】:

这里是:

<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 个不同长度的字符串的各种方法的基准测试:

Function(x As String).......................:总时间相对效率 %)

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%)

【讨论】:

以上是关于如何区分 .NET 中的空字符串和零长度字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 不区分空字符串和空字符串?

LeetCode——一和零

LeetCode——一和零

474-一和零(二维费用的背包问题)

第四章 串和数组 (主要kmp算法)

MySQL中如何排除null和空字符串的条件