.Net中的早期绑定和后期绑定(二)

   上篇介绍了.Net中绑定的故事背景,在文章的末尾引出了“早期绑定和后期绑定”,那么本文就针对.Net中的绑定做一个简单的介绍。

   早期绑定

   早期绑定:如果在编译时 .Net 能够知道属性或方法所属的对象,就可以预先查找该成员在类型库中的 DispID 或 vtable 地址。这样就无须在运行时调用 GetIDsOfNames。当显式声明了变量的类时,例如 As Class,该变量就只能存放该类的对象的引用。.Net 就可以为该变量调用的所有属性和方法使用早期绑定。

   后期绑定

   在.Net中存在基类Object,所有类都继承与基类,当我们声明变量时没有指定该变量的类型时,.Net会将该变量声明为As Object ,.Net在编译时就无法确定该变量将引用哪种类型的对象。因此,.Net 必须使用后期绑定,在运行时确定对象的属性和方法能否使用该变量。
   知道了早期绑定和后期绑定,再来看我们的代码:

    ’后期绑定,其对象类型为Object
      Dim iu = createuser.ProduceUser 

     '早期绑定,其对象类型为IUser
     Dim iu as IDAO.IUser=createuser.ProduceUser  
   程序中变量的对象类型:

技术分享技术分享

         期绑定我们一直再用,还记得VB中Variant(可变类型)吗,那是我们最早开始接触的一种后期绑定,现在我们在做机房时用到的泛型,其中也涉及到了后期绑定。

   早期绑定与后期绑定的区别

   早期绑定:早期绑定对象比后期绑定对象快很多,并且能通过确切声明所用的对象种类使代码更易于阅读和维护。早期绑定的另一个优点是它启用了诸如自动代码完成和动态帮助等有用的功能,这是因为 Visual Studio 集成开发环境 (IDE) 可以在您编辑代码时准确确定您所使用的对象类型。由于早期绑定使编译器可以在编译程序时报告错误,所以它减小了运行时错误的数量和严重度。

   后期绑定:后期绑定,则每次调用属性或方法时,Visual Basic 都要将成员名传给该对象 IDispatch 接口的 GetIDsOfNames 方法。GetIDsOfNames 返回该成员的派遣 ID,或 DispID。Visual Basic 再将该 DispID 传给 IDispatch 接口的 Invoke 方法来调用该成员。对进程外部件而言,这意味着一次额外的跨进程方法调用,结果是调用开销翻番。

    总结

    小问题蕴藏大智慧,了解了早期绑定和后期绑定在我们今后的编程中要慎重使用。大家有没有留意到在上一篇文章中,我们在方法体中使用后期绑定也能获取变量的成员变量,这是因为.Net中存在着类型推理的机制。关于类型推理,大家可以上网查查有关这一方面的知识,在这里就不介绍了...PS:不将就是发现问题的原动力,继续保持...

     

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。