VB6的后期绑定和前期绑定
1. 什么是后期绑定和前期绑定后期绑定
MSDN 6的定义如下:
后期绑定:若将一个变量声明为 As Object 或 As Variant(包括 As Form 或 As Control 的变量),Visual Basic 在编译时就无法确定该变量将引用哪种类型的对象。因此,Visual Basic 必须使用后期绑定,在运行时确定对象的属性和方法能否使用该变量。
若使用后期绑定,则每次调用属性或方法时,Visual Basic 都要将成员名传给该对象 IDispatch 接口的 GetIDsOfNames 方法。GetIDsOfNames 返回该成员的派遣 ID,或 DispID。Visual Basic 再将该 DispID 传给 IDispatch 接口的 Invoke 方法来调用该成员。
对进程外部件而言,这意味着一次额外的跨进程方法调用,结果是调用开销翻番。
前期绑定:如果在编译时 Visual Basic 能够知道属性或方法所属的对象,就可以预先查找该成员在类型库中的 DispID 或 vtable 地址。这样就无须在运行时调用 GetIDsOfNames。
当显式声明了变量的类时,例如 As Widget,该变量就只能存放该类的对象的引用。Visual Basic 就可以为该变量调用的所有属性和方法使用前期绑定。
建议在 Visual Basic 和应用程序中使用这种方法来声明对象变量。
使用前期绑定还是后期绑定完全取决于声明变量的方式。对象的创建方式对此没有任何影响。
2. 后期绑定的几个优势和好处
第一,个人认为,由于VB6不支持实现继承,对于某些设计,可以使用将对象定义为Variant变量,而获取某些设计和编码上的便利,而得到接口或抽象类的好处。例如:
如定义2个类:
Class1: 1Option Explicit 2 3Public Sub Update() 4 MsgBox "Class1 Updated" 5End Sub Class2: 1Option Explicit 2 3Public Sub Update() 4 MsgBox "Class2 Updated" 5End Sub |
在使用的时候,可以使用以下方法,而实现一些设计模式:
1Dim objTest As Variant 2 3Dim objC1 As New Class1 4Set objTest = objC1 5objTest.Update 6 7Dim objC2 As New Class2 8Set objTest = objC2 9objC2.Test 10 |
这样,无须继承机制,也可以得到抽象接口的优势,而使接口、实现分离。
第二,在调用外部的COM自动化组件时,如Office,如果通过这种方式调用,对于不同版本的Office,如果你调用的方法、属性都是存在的,那么可以适应不同版本的Office,但如果通过前期绑定,在项目引用中确定对象类型,是有版本兼容问题的。
3. 效率和劣势
其实最主要的劣势是效率问题,《Advanced Visual Basic 6》一书说,使用Variant变量和Long变量进行循环,效率差别是1.5倍,而没有别人认为的那么大,而且对于大对象,差别也不是很大。对于本文前边的例子,如果创建的是进程内对象,前期绑定和后期绑定调用效率差别大概2:3左右,也就是说也是1.5倍。对于调用Office这样的外部COM自动化对象,也许差别大一些,没有专门测试,不过对于Office自动化,速度主要是决定于Office本身的启动、初始化。
另外一个劣势是没有了IDE下的属性、方法成员自动列出。
所以,个人认为,在使用VB6的时候,为了得到好的设计,有时不妨使用一些VB6的后期绑定的特性,来提高设计质量。
摘自:网络整理
相关文章参考:
★VB查找替代字符串的函数
★VB换行气泡提示类
★VB/VBA通用路径选择对话框
★ASCII码表0-255完整版 附详细注释
★VB的KeyAscii
★VB取得TextBox、RichTextBox光标所在的行和列(支持汉字)
★VB取得TextBox、RichTextBox光标所在的行和列(支持汉字)
★VB如何实现Undo(撤消)功能
★VB计算文本文件的行数
★VB获取快捷方式原文件路径
★微软 Small Basic 简体中文版 已经发布了
★VB操作Excel 非常详细 [网摘]
★VB如何判断文件正被占用/已被打开
★VB添加listbox 的水平卷动轴
★VB打开资源管理器并指定文件
★VB根据窗体自动调整窗体内控件大小 注:实用,可以直接引用
★VB中的指针技术
★Visual Basic编程常见问题及解答(1)
★Visual Basic编程常见问题及解答(2)
★Visual Basic编程常见问题及解答(3)
★VisualBasic变量、常数和数据类型及过程概述
★VB6的后期绑定和前期绑定
★VB用户控件制作讲解与实例
★VB制作OCX控件的步骤
★VB中FSO的调用的两种方法
★用VB操作EXCEL
★VB判断文件及目录的存在性
★VB网站(最新、经典源代码、技术文章、基础知识)
★VB得到指定文件夹下的文件列表
★用VB产生随机任意大小文件挤满硬盘
★VB文件的读写操作
★VB创建超链接 打开指定网站的几种方法
★VB 源码 删除重复行程序 函数
★VB 计算自己程序段所用时间
★VB 获取路径名各部分 (获取文件路径,获取文件名,获取文件扩展名)自编
★几行VB代码拿下注册表
★VB 在浏览器中打开指定网址
★VB窗口置顶
★vb在 ListBox 之中点击右键弹出菜单
VB6的后期绑定和前期绑定相关推荐
- 前期绑定 和 后期绑定
thinking in java 读书笔记(感悟): 页码:P9 (想看书上怎么讲的.自行翻看 P9 页)写于:2018年3月29日19:22:14作者:淮左白衣 目录 目录 场景: 前期绑定 后期绑 ...
- 前期绑定 vs 后期绑定
即:变量的类型,在编译时就能够确定的就是前期绑定:变量的类型,在编译时无法准确确定,只有在运行时才能确定的变量类型,就是后期绑定. 转载于:https://www.cnblogs.com/JAVA-S ...
- C#前期绑定和后期绑定操作Excel-------实现简单打印功能
1,前期绑定 前期绑定需要引用Microsoft.Office.Interop.Excel.dll,代码有提示功能,编写方便,且代码量小.但是和具体的office版本密切相关,不同版本的Excel可能 ...
- 前期绑定 php,关于php:后期静态绑定在PHP中的使用
什么叫前期动态绑定呢?其实咱们在之前的文章PHP中的static中曾经说过这个货色了.明天咱们还是再次深刻的了解一下这个概念. 首先,咱们通过一段代码来引入前期动态绑定这一概念: [腾讯云]云产品限时 ...
- knockout+html绑定,Knockout.Js官网学习(style绑定、attr绑定)
Style绑定 style绑定是添加或删除一个或多个DOM元素上的style值.比如当数字变成负数时高亮显示,或者根据数字显示对应宽度的Bar.(注:如果你不是应用style值而是应用CSS clas ...
- Attribute 绑定、类绑定和样式绑定
Attribute 绑定.类绑定和样式绑定 1. 绑定到 Attribute 优先设置带有 Property 绑定的元素的 Property.如果没有可绑定的元素 Property,可以使用 Attr ...
- 背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue...
原文:背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue [源码下载] 背水一战 ...
- 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定...
原文:背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定 [源码下载] 背水 ...
- Angular中数据文本绑定、绑定Html、绑定属性、双向数据绑定的实现方式
场景 Angular介绍.安装Angular Cli.创建Angular项目入门教程: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...
最新文章
- 微生物组—宏基因组分析专题培训开课啦!10月北京
- awk 统计数据在文件中的出现次数
- python0.1+0.2不等于0.3_为什么0.1 + 0.2不等于0.3?
- nRF52832 — 连接指定name、UUID、addr的蓝牙设备
- No module named 'pandads'
- Python特殊语法:filter、map、reduce、lambda
- 单元格自适应宽度_Dynamic Conv:自适应卷积内核有效提升网络模型的表征能力不增加模型深度和宽度,牺牲一点延迟...
- 关于EGE图形库在CodeBlocks下的配置
- [置顶]C#执行Excel宏模版的方法
- JavaScript If…Else 语句
- Asp.net Core 2.1新功能Generic Host(通用主机)深度学习
- OD debug matlab,OllyDebug基本使用方法
- C#中事务的简单使用
- c++分割字符串方法
- 功能表单之评星、进度条、颜色选择器的使用——JEPLUS软件快速开发平台
- 英文的写作 —— 句子的积累
- 论文阅读笔记(十一)——Mobilenet-SSDv2: An Improved Object Detection Model for Embedded Systems
- 墨卡托与经纬度转换工具
- 物联网网络层安全需求
- md5加密依赖工具utility使用小记
热门文章
- 等重构完这系统,我就辞职!
- 阿尔法狗 3 天走完人类千年棋史,被反超的我们该如何绝地求生?34 个开源项目告诉你!
- linux sed工具,玩转Linux - 神级工具 sed awk
- 熬了整整30天,字节跳动算法工程师面试
- 第 3 章 查询截取分析
- 自己写个简易版 PicGo
- 通讯与计算机网络作业,通讯与计算机网络作业平时作业(填空题问答和计算题)讲述.doc...
- oracle如何杀掉表死锁,oracle杀死死锁的方法
- java邮箱格式_JavaMail入门:创建纯文本、HTML格式的邮件
- 弹性地基梁板实用计算_建筑地基基础设计规范要点