新建From1(窗体),新建Command1(按钮CommandButton),代码:
Private Sub Command1_Click()
Dim strA As String
strA = "aaa" '不管是否曾经设置过值
strA = ""
Debug.Print LenB(strA)
If LenB(strA) = 0 Then Debug.Print "1" '比2、3效率更高
If Len(strA) = 0 Then Debug.Print "2" '比3效率更高
If strA = "" Then Debug.Print "3"
End Sub
运行结果:
0
1
2
3
可以看到,If LenB(strA) = 0 Then 可以替代 If strA = "" Then
理论分析:LenB只看1个字节,Len在Unicode(VB6默认Unicode编码)中看2个字节,strA = ""需要比较更多。
1、这是一个极为简单的问题,也是诸多好汉常遇到的问题。对于VB/#VBA#而言,不就是if Str="" then就了事了么,有何谈扯的!
2、若虎头虎脑的,也就罢了,因为VB/AVBA的设计,也不会让这种直白的方式犯错。但看过《VB6 字符串探究 VB/VBA字符串,是个冒牌货,难怪那么慢!》后,还这么认为的,就有点不合格了。在这篇文章中说了,声明1个字符串变量Str,仅在栈上占了个4Bytes位置,是个空指针,就是什么都没有。
3、细想一下,""只不过是Size=0的字符串,也即0长字符串,它不是还有脑袋和尾巴么?这明明是存在的东西,怎么就和空指针画上等号了呢?这就是VB/VBA人性的一面,没内容的字符串不就是空字符串嘛!
4、从《VB/VBA字符串》一文里的示例中,可以看到,对刚声明的Str,用StrPtr函数取数据指针,返回值是0。但对""同样取数据指针却不为0。这就说明""是分配了内存的,只不过大小为6Btyes。
5、所以,比较表达式 Str="",算不算好的判断呢?你看背后做了哪些事就会明白:先给""常量分配一个临时内存,拷贝数据(无),然后调用字符串比较函数进行比较,最后返回结果,再释放分配的临时内存。这里面更别提编码转换之类的。可谓是绕了一个大圈子,才换来理解上的直白。
6、那有没有所谓更好的方法呢?其实从BSTR的结构入手即可。若要与Str=""等效,则用LenB函数进行判断。LenB函数就是直接获取BSTR结构体的Size成员的值。也即:if LenB(Str) then来代替,则简单高效了很多。
7、当然要判断字符串变量是否为未被初始化的那种空,则使用StrPtr函数判断即可。