查看: 404  |  回复: 0
  VB6 更高的效率 If LenB(strA) = 0 Then 替代 If strA =
楼主
发表于 2024年3月21日 16:30

新建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函数判断即可。

您需要登录后才可以回帖 登录 | 立即注册
【本版规则】请勿发表违反国家法律的内容,否则会被冻结账号和删贴。
用户名: 立即注册
密码:
2020-2024 MaNongKu.com