就是相同的工具 。
CLR提供不平行的跨语言集成,包括跨语言继承代码的能力 。所有使用CLR的语言共
享一个通用类型系统,它使使用多种语言开发应用程序变得更简单 。我不喜欢把 C API
声明翻译成VB里可以使用的形式,所以我很赞赏通用类型系统带来的好处 。
在CLR中运行的代码被称为被管理代码,被管理代码使用的内存完全由CLR来控制 。
被管理代码带来很多好处 , 包括跨语言集成、跨语言异常处理和简化的部件相互作用模
型 。Visual Basic被限制为只能以被管理代码的方式工作,然而C#拥有跳到非被管理代
码的能力(执行到运行库之外),并能做像指针操作这类事情 。这是VB和C#不同等的情况
之一 。这种能力到底有多重要取决于你想干什么 。
CLR造成的体系结构差别要比跨语言集成、共享功能和被管理代码等深刻 。首先,V
isual Studio.NET的支撑结构不是 COM 。另外 , VB.NET里的所有东西,甚至字符串都是
对象 。因为这些和其它一些原因,Microsoft改变了支撑结构处理对象的方式 。COM实现
了一个引用计数方案,这样每次引用一个对象时,计数器递增 。当一个对象引用超出作
用域或被释放时,计数器递减,当引用计数减少到零时就终止这个对象 。Microsoft声称
在.NET架构下引用计数的开销太大,以至于不能在 .NET中实现它,所以它放弃了引用计
数转而使用垃圾收集 。
垃圾收集需要新体系结构
CLR垃圾收集器主要是监视一个程序的资源,当可用资源达到确定的阈值时寻找无用
的对象,并在发现它们的时候清除这些对象 。垃圾收集的一大好处就是你不再需要担心
大多数普通的循环引用 , 即子对象引用了父对象,然后父对象又引用了子对象 。在引用
计数方案下,循环引用使两个对象都不能被释放和清除 。然而,垃圾收集器会发现循环
引用并清除它们 。这也意味着释放对象的最后一个引用时不再需要立即清除对象 。
垃圾收集的一个后果是:你再也不能指望一个类的 Terminate 事件能在适当的时机
发出 。实际上,如果线程被阻塞 , 可能根本就不会发出 Terminate 事件 。和COM提供的
确定化终止相反,它被称为不确定的终止 。缺乏确定化终止,以及因为垃圾收集器重新
安排并压缩内存从而不能使用指针的事实,在新闻组里激发了一波激烈的辩论 。我想这
些新限制可能会令你痛恨,因为你要依靠确定化终止;也可能你漠不关心 , 因为你不依
赖 Terminate 事件 。垃圾收集并不是万灵药,实现弱引用依然需要做一些考虑 。
从引用计数到垃圾收集只是 Visual Studio.NET 的支撑结构不是 COM 这个事实的
表象之一 。你能在VB.NET中使用COM对象 , 比如说ActiveX服务器或ActiveX控件 。然而,
你必须通过包装访问这些对象 。任何时候听到“包装”这个术语,你应该明白你面对着
性能损失,并且对象的行为可能有所不同 。如果当计划移植一个使用了大量COM对象的工
程,就需要认真地测试和计划,可能需要重新规划应用程序的结构才能移植成功 。坦率
地说,你要有遭受挫折的准备 。还记得从VBX迁移到 OCX的过程吗?我记得,我的精神病
医生也记得 。我很快就要再去看他了 ;-)
语言本身的变化要远远超过体系结构的变化 。大部分改变确有道理,但我并不认为
所有的改变都是如此 。以前版本的VB允许你以很多方法来做很多事,以至于统一的编码
推荐阅读
- 包含postgresql物化视图更新的词条
- sap养护,SAP养护剂
- 关于aspnet的项目,aspnet的优点
- 怎么用jquery做星级评价,jquery实现五星评价
- go语言跨平台gui go语言跨平台ui开发
- 火影直播电视盒子叫什么,火影tv版看完该看哪里
- 电视上如何看手机直播软件,电视怎样看手机上的节目
- php返回数据到安卓 php返回文件流
- 手机为什么不能播放视频了,为什么手机没法播放视频