2011-09-20 60 views
1

我有一些功能,是否通过后期绑定或执行该加法运算不进行加法运算变量数据类型在VB6中通过后期绑定执行加法操作吗?

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

或仅当我在变体数据类型上调用某种方法时才执行后期绑定,而不是在二进制操作时执行后期绑定?

我也想知道是在VB .NET中添加对象数据类型(选项严格关闭),C#中的动态数据类型时使用的晚期绑定。

谢谢。

+0

呃,迟到/早期绑定对数学运算符没有影响。你能重新解释一下这个问题吗? – Deanna

+0

+是数学运算,如果我们正在处理的数字类型,而不是字符串或变体(我认为是这样...) –

+0

那么晚/早绑定进入它呢? – Deanna

回答

2

这与早/晚绑定无关。我认为你指的是value1value2的数据类型?问题是,然而,令人困惑,因为它被标记VB6,但你用Return这是不是在VB6

有效的关键字在VB6的情况下,两个value1value2会变种,因此他们可能是数字或字符串(或者甚至是对象) 。该功能还将返回一个Variant

  • 如果你调用该函数有两个字符串 - 总和结果将是连接字符串:value1value2
  • 如果在两个数值通过,则总和将是算术和价值观:value1 + value2

是始终是最好的避免这种类型的节目内容,并确定您需要,以防止意外的结果类型

编辑:

从MS VB.NET文档但这是VB6很相似:

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

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

后者可以导致运行时错误,因为你可能打错一个方法名和编译器不能挑选,直到它尝试执行行,并不能找到您所键入的方法。看看下面的更多信息:Early vs Late Binding

+0

对不起,我忘了VB6没有返回,但是问题与VB6有关:) –

+0

@Artyom我的答案对于VB6是正确的 - 我是否正确地回答了你所问的问题? –

+0

我没有使用这种类型的编程,我只是想知道这里发生了什么。据我所知,一切都是在运行时完成的。检查两个值的类型,然后决定如何对这些数据类型进行加法运算。所以我想知道,这个过程是一个晚期的约束。如果不是,那么它是什么? –

1

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

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