【问题标题】:What is vbNullString, How it use?什么是vbNullString,它如何使用?
【发布时间】:2017-09-02 04:30:39
【问题描述】:

有什么区别

Len(Me.txtStartDate.Value & vbNullString) = 0

Len(Me.txtStartDate.Value) = 0

【问题讨论】:

  • Len(Me.txtStartDate.Value & vbNullString) = 0 相当于做Len(Me.txtStartDate.Value & "") = 0。我能明白为什么有人会这样做的唯一原因是在将其传递给Len 之前确保该值是文本,因为如果您将原始数字传递给Len,则会引发错误。

标签: vba


【解决方案1】:

vbNullString本质上是一个空字符串指针

Debug.Print StrPtr(vbNullString) 'prints 0

看起来相当于一个文字 "" 空字符串,但它不是:

Debug.Print StrPtr("") 'prints an address; 6 bytes are allocated for it

实际上你的两个例子没有区别......但只是因为Me.txtStartDate.Value 已经String

如果你这样做:

Debug.Print Sheet1.Range("A1").Value & vbNullString

然后您将通过字符串连接在Sheet1.Range("A1").Value(例如DateDouble)返回的任何类型之间进行隐式类型转换 ,因为& 运算符仅用于字符串连接,而该表达式的结果将是String

换句话说,这是一种相当复杂的方式:

Debug.Print CStr(Sheet1.Range("A1").Value)

或者,作为litelite mentioned,这是一种相当复杂的方法:

Len(CStr(Me.txtStartDate.Value)) = 0

您通常使用 vbNullString 代替空字符串 "" 文字,以节省分配 6 个字节(4 个用于字符串指针,2 个用于空字符),并使您的代码清楚地表明您的意图(例如“我意思是一个空字符串,这不是错字”),类似于在 C# 中使用 string.Empty 的方式。

【讨论】:

  • 你并没有真正节省内存,因为 vbNullString 需要至少 16 个字节(4 个字节空指针 + 12 个 ansi 字符),而 "" 需要 12 个字节(4 个字节指针 + 6 个字节 bstr + 2个ANSI字符)。由于所有字符串都映射到字典中,因此您最终可能会使用更多空间和vbNullString。这只是我个人的看法,但我发现 "" 不那么含糊,因为它清楚地表明它是一个长度为 0 的字符串。
  • @FlorentB。很公平。 FWIW 我强烈推荐vbNullString 而不是"",原因完全相同,在.net 中string.Empty 优于""。内存参数几乎没有实际意义,没有计算机会因为过度分配空字符串而出现内存不足 - 这一切都是为了可读性/可维护性。 string.Empty vs ""
  • 如果vbNullString 被称为vbEmptyString,我会同意你的看法。 null 这个词可能会令人困惑,特别是因为还有 vbNullChar,它是一个长度为 1 的字符串。Null-References-The-Billion-Dollar-Mistake-Tony-Hoare
【解决方案2】:

vbNullString 是什么?它是一种奇怪的鸟,它的存在只是为了调用用 C(或 C++)编写的 DLL 中的函数。

看看http://vb.mvps.org/tips/varptr/。它描述了 VBA(和 VB6)中的一组(现在隐藏的)函数,这些函数仅存在于允许传递指向变量内容的指针,同样主要是传递给用 C(或任何其他语言)编写的 DLL 中的函数指针)。

(从技术上讲,VBA 不做指针,所以任何可能由函数返回的指针 - 从技术上讲 - 被强制转换为长整数。ByRefWith 当然涉及指针,但在隐藏-幕后的方式。)

特别要试试StrPtr(vbNullString);它将返回0。如果您尝试改用StrPtr(""),您会得到一些非零结果。结果是一个指针,指向字符串的字符在内存中的实际位置。然而,0 的指针在 C(和 C++)中意味着一些特殊的东西——它通常被称为 NULL 指针(或者简称为 NULL,或者可能是 null),它意味着一个指针指向任何地方。在 C 编程中,有时程序员希望指针参数为 NULL 以表示函数的特殊含义。

如果您连续几次尝试StrPtr(""),您可能会得到一些不同的非零结果。这是因为 VBA 会为每次尝试创建一个全新的空字符串,而且看起来很奇怪,任何内存都应该用于空字符串,请记住,VBA 中的字符串包含一个长整数,指示字符数字符串。

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多