-lb选项指定编译器是否允许代码使用后期绑定技术调用方法或 GET/SET 属性
-lb[+|-]
+ | - | 当编译器无法生成早期绑定调用的代码时,指定 + 或 -lb 可指示编译器生成对实例变量或方法的晚期绑定调用。 |
X# 编译器总是尝试生成对所有类方法、属性和字段的早期绑定调用。即使在 Visual Objects 中被称为 "未类型化 "的方法也是如此。严格来说,没有什么是 "未类型化 "的。如果不能生成早期绑定调用,就会出现编译时错误。
在 Visual Objects 中,可以在编译器不知道对象确切类型的情况下调用对象上的方法和访问实例变量。具体方法是使用 OBJECT 或 USUAL 类型的变量来保存对象引用。要做到这一点,必须不选中 VO 应用程序选项对话框中的 "Only Early(仅早期) "选项。
此外,还可以在 ARRAY 的每个元素上调用一个方法。每个数组元素都必须包含一个实现指定方法的对象,否则会出现运行错误。
-lb 选项与 Visual Objects Only Early 选项正好相反。
与早期绑定相比,晚期绑定产生的运行时开销要大得多,而且无法进行编译时参数和返回值检查。如果对象不支持正在访问的字段或属性、正在调用的成员或不正确的参数类型或计数,任何延迟绑定调用都有可能在运行时失败。只有在现有代码中或没有其他可行的替代方法时,才能使用早期绑定。
要在 Visual Studio 开发环境中设置该编译器选项,请执行以下操作
1.打开项目的 "属性"页面
2.点击 Language 选项卡
3.在 General 部分,编辑 Allow Late Binding property.
4.查看属性页
使用 -lb 开关时,下面的示例可以编译。如果不使用 -lb,则会出错。
请注意,使用延迟绑定调用可能会影响应用程序的性能,并有可能出现运行时错误,而如果使用早期绑定,编译器是可以捕捉到这些错误的。后期绑定只能用于与现有 VO 代码兼容。
如果启用了 -lb 选项,那么上述示例将被编译成:
请注意,虽然这个示例可以正确编译和执行,但如果更改了 CLASS foo 的定义,并且删除了 INSTANCE i 或将其改为方法,那么示例将在运行时失败。同样,如果更改或删除了方法 bar,示例也可能在运行时失败。因此,我们强烈反对延迟绑定编程。请考虑使用子类化和继承。