【发布时间】:2009-01-06 13:12:59
【问题描述】:
在 VB6 中,有人告诉我,在测试空字符串时,使用以下方法验证字符串的长度会更快:
If Len("ABC") = 0 then 'fast
或
If LenB("ABC") = 0 then 'even faster
代替:
If "ABC" = "" then 'slower
您是否知道这在 VB.NET 中是否也是如此? 谢谢。
【问题讨论】:
在 VB6 中,有人告诉我,在测试空字符串时,使用以下方法验证字符串的长度会更快:
If Len("ABC") = 0 then 'fast
或
If LenB("ABC") = 0 then 'even faster
代替:
If "ABC" = "" then 'slower
您是否知道这在 VB.NET 中是否也是如此? 谢谢。
【问题讨论】:
我不完全是 VB 的语法,但在 C# 中你可以使用 String 静态方法 IsNullOrEmpty:
String.IsNullOrEmpty("ABC")
当你在调试这个方法时,它会检查参数的.Length。检查长度总是更快,因为在字符串比较时,编译器必须创建一个新对象进行比较(在本例中为“ABC”字符串)。
【讨论】:
没必要,我的意思是你在开玩笑吗?有多少人编写程序来比较字符串以查看它是否为零长度对性能有任何影响。即使字符串没有保留长度计数并且 VB 每次都进行 c 样式的 strcmp() 字符串比较,字符串比较函数也不需要很长时间才能确定其中一个字符串的长度为零,对吗?但是 .NET 字符串确实包含一个长度字段,因此当您进行字符串比较时,首先要检查的是长度是否不同,即直接 int 比较。如果是函数调用并且仅当 JIT 内联 Len() 时,您自己执行此操作即可节省所有费用。
顺便说一句,在 VB.NET 中,您不需要调用 String.IsNullOrEmpty(),因为字符串之间的比较被转换为对 String.strcmp() 的调用,它将空值(VB 中的无)转换为对 String 的引用.空字符串。然后它继续调用反射器无法检查的本机函数,但我很确定它所做的第一件事是检查字符串的长度是否不同。
【讨论】:
你应该使用:
If ("Value").Length > 0 Then
End If
【讨论】:
我认为等效于 IsNullOrEmpty 的 VB6 的最佳解决方案是
Public Function IsNullOrEmpty(ByRef s As Variant) As Boolean
If IsNull(s) Then ' IsNull returns true if s is a Variant that is Null
IsNullOrEmpty = True ' IsNull returns false if s is a Variant and s = vbEmpty
Exit Function
End If
If LenB(s) = 0 Then ' never compare a string to "" - it's slow
IsNullOrEmpty = True
Exit Function
End If
If LenB(Trim(s)) = 0 Then
IsNullOrEmpty = True
Exit Function
End If
IsNullOrEmpty = False
End Function
具有讽刺意味的是,如果您有设置为 vbEmpty 的字符串或变体,那么此函数将返回 false,因为作为字符串的 vbEmpty 为“0”。所以如果你不小心使用这个版本,你可能会得到一些奇怪的错误。
【讨论】: