添加操作是否由VB6中的后期绑定执行?

时间:2011-09-20 10:37:57

标签: vb6

我有一些函数可以对变量数据类型执行加法运算

Public Function Sum(value1, value2)
    Sum = value1 + value2
End Function

这个加法操作是否通过后期绑定执行?

或者只有当我在变量数据类型上调用某些方法而不是使用二进制操作时才执行后期绑定?

我也想知道在VB .NET中添加Object数据类型时使用的后期绑定(Option Strict已关闭),C#中的动态数据类型。

谢谢。

2 个答案:

答案 0 :(得分:2)

这与早期/晚期绑定无关。我认为您指的是value1value2的数据类型?问题是令人困惑,因为它标记为VB6,但您使用的Return不是VB6中的有效关键字

对于VB6,value1value2都是变体,因此它们可以是数字或字符串(甚至是对象)。该函数还将返回Variant

  • 如果您使用两个字符串调用该函数 - 求和结果将是连接字符串:value1value2
  • 如果传入两个数值,则总和将是值的算术总和:value1 + value2

总是最好避免这种类型的编程并定义防止意外结果所需的类型

修改

从MS VB.NET文档,但这与VB6非常相似:

+运算符(Visual Basic)的主要目的是添加两个数字。但是,它也可以将数字操作数与字符串操作数连接起来。 +运算符有一组复杂的规则,用于确定是添加,连接,发出编译器错误信号,还是抛出运行时InvalidCastException异常。

这与早期或晚期绑定无关,因为这与编译器知道对象在编译时具有哪些方法,属性和事件(早期绑定)以及在编译时不知道这些(后期绑定)< / p>

后者可能导致运行时错误,因为您可能输错了方法名称,并且编译器在尝试执行该行并且找不到您键入的方法之前无法选择该方法。有关详细信息,请查看以下内容:Early vs Late Binding

答案 1 :(得分:1)

在函数中进行后期绑定调用的唯一情况是,其中一个Variant参数是对象引用。在评估引用参数的+运算符(或任何其他表达式)时,首先将其DISPID_VALUE(0)成员称为后期绑定(通过IDispatch::Invoke),并在表达式中使用retval。如果retval是IDispatch引用,则递归调用DISPID_VALUE。这就是为什么你可以在表达式(种类)中使用recordset("ID")而不是recordset.Fields.Item("ID").Value

如果在表达式中使用已知类型(接口)的显式对象引用(例如+运算符),则编译器会发出调用默认属性早期绑定的代码,这样可以在运行时更简单地进行评估。