object - Visual basic 6 内置函数的默认属性

标签 object properties vb6 default-value

Visual Basic 具有默认属性,有时在计算表达式时会隐式调用这些属性。但是,我似乎遇到了与默认属性的隐式执行之间的差异。项目布局如下:

Class1:

property test -> class2 (default)

Class2:

property test -> string "hello world" (default)

表格1:

Dim x As New Class2
MsgBox x
Debug.Print x

MsgBox 语句将隐式调用 x 的默认值(在 class1 上进行测试),并且还会调用 x 的默认值(在 class2 上进行测试),从而导致屏幕上显示“hello world”。然而,Debug.Print 语句不会执行此操作,通过跟踪调试器,可以看到仅调用了第一个默认值(在 class1 上)。

我已经验证了许多内置函数(例如 MsgBox/RTrim/LTrim)都表现出这种行为,并且任何自行编写的方法或类方法都不会执行此操作;但我无法弄清楚为什么会发生这种情况?

最佳答案

这根本不是内置函数的“行为”,而是取决于 COM 将对象引用和变体转换为字符串的方式。这也与 Set 和 Let 语言关键字和表达式求值有关,尤其是括号。考虑这个示例代码:

Private Sub Form_Load()
    Dim x As Class1
    Dim v As Variant
    Dim s As String

    Set x = New Class1
    Set v = x   ' None
    Let v = x   ' Once
    Set v = (x) ' Once
    Let v = (x) ' Twice
    's = x      ' Compile error: Type mismatch
    Set v = x
    s = v       ' Twice
    s = CVar(x) ' Twice
    MsgBox x
    'Debug.Print CStr(x) ' Compile error: Type mismatch
    'Debug.Print CVar(x) ' Run-time error: Type mismatch
    Debug.Print CStr(CVar(x)) ' Twice
    pvTest1 x
End Sub

Private Function pvTest1(ByVal o As Variant)
    'Debug.Print o      ' Run-time error: Type mismatch
    Debug.Print CStr(o) ' Twice
End Function

请注意,将对象引用转换为字符串是一个编译时错误(CStr(x) 调用),而包含引用的变体(IDispatch )则可以很好地转换(s = v)。最后一个分配将尽可能深地“展开”默认属性,同时默认属性计算为 IDispatch(调用 Invoke 并将 DISPID 设置为 -1)。

简而言之:如果您有对对象的引用,并且需要将默认属性递归计算为“原始”数据类型(例如字符串)的值,请使用 CStr(CVar(x)) (或 CInt(CVar... )等)

关于object - Visual basic 6 内置函数的默认属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1362223/

相关文章:

java - 我如何正确定义对象的 getter 和 setter 方法

javascript - 将图标与对象相关联

python - 如果该属性在派生类中被覆盖,如何调用基类的属性?

c++ - 使用 static_cast 向下转型 - 指针和对象

php - 将 JSON 字符串解析为数组,而不是对象

ios - 如何在使用属性时修复此泄漏?

properties - 如何使用 Kotlin 绑定(bind)属性值?

reference - VB6:名称与现有模块、项目或对象库冲突

email - 无邮件客户端时通过VB6发送邮件

vb6 - 在 VB6 中为工具栏控件创建键盘快捷方式