无用单元的收集

来源:岁月联盟 编辑:zhu 时间:2007-01-31
   

  CLR中的无用单元收集程序监控一个软件的资源,一旦系统中的可用资源减少到了一个极限,发现无用的对象后就会消灭它。无用单元的收集带来的一个好处是你无需担心最常见的循环调用问题,在一个循环调用中,子对象调用父对象,而父对象又调用了子对象。在一个调用调度系统中,循环调用可能使任一对象都不能被释放或消灭,而无用单元收集程序则可以发现这种循环调用,并消灭它,这也意味着释放最近对一个对象的调用无需立即消灭这个对象。

  无用单元收集带来的后果是:我们无须再依赖于一个类的Terminate事件。事实上,如果线程被阻塞了,Terminate事件也不可能得到执行,这也就是所谓的不确定性终止,与它相对的是由COM提供的确定性终止。确定性终止的缺乏和由于无用单元收集而引起的对内存单元的重新调度和紧凑在互联网上的新闻组中引起了热烈的讨论。我认为这些限制会引起你的不快,因为你已经习惯了确定性终止,也许你并不依赖于Terminate事件而认为这无关紧要。无用单元收集程序并非是万能的,在使用时仍然会有许多限制。

  从引用计数到无用单元收集只是说明Visual Studio.NET的基础架构不再是COM的一部分。在VB.NET中,你仍然可以使用ActiveX服务器、ActiveX控制等COM对象,但必须通过适当的"wrapper"才行。提到"wrapper"这个词,就可能意味着性能上的折扣和执行上的差异。如果要移植一个使用了大量的COM对象的软件,就需要进行很好的测试和规划,甚至重新设计部分代码才能确保移植成功。坦率地说,你会遇上挫折,还记得把VBX向OCX移植的恶梦吗?

  在开发语言中的变化还不仅仅局限于架构的变化,这些变化中的大多数都有积极的意义,但我认为并非所有这些变化都是积极的。在过去的VB版本中,你可以用多种不同的方法来完成同一件任务,既没有统一的编码标准也无法执行这么一个标准。微软对VB进行了一些比较显著的改变,以便"净化"这种语言,在大多数情况下,你只有一种方法可以完成某一任务。

  首先,向过程的参数传递数据的缺省方法由传递地址(ByRef)改成了传递数值(ByVal),这是其中变化最大的部分,原因是向参数传递地址要比传递数值的风险要大得多,这种风险主要来自调用过程可能在无意间改变参数。当然还可以用地址传送参数,但必须改变新的缺省的调用方法。

  其次,抛弃了Set语句。把一个对象的地址传递给一个变量只要用一个等号就可以了,对象与其他的数据类型没有什么区别。这看起来很"酷",但也有一定的负作用:缺省的属性不能用了。例如,再不能用下面的方式来引用一个属性了:

[责任编辑:editor]

   

  Text1 = "What, me worry?"

  而必须使用如下的方式:

  Text1.Text = "What, me worry?"

  初一看这似乎是一个不必要的变化,但必须抛弃缺省的属性了。例如,假设有一个被称作objFoo的对象变量,不使用Set语句,我们就不清楚这个语句引用了什么:

  objFoo = Text1

  这个语句引用的是Text1变量呢还是Text1变量的值的Text属性呢?我们不能确定这一点,编译器也不能。因此,不要Set语句也就必须抛弃缺省属性。

  一个我所不喜欢的变化:不能再使用不同的范围定义Property Get、Property Set过程。VB.NET中没有了Property Let语句:对于对象和变量时都使用Property Set语句,这就意味着不能再使用一个与Public Property Get一块儿使用的Friend Property Let过程。如果你是用VB创建组件的话可就有麻烦了,许多组件开发人员创建组件时使用了Friend Property Set过程,这样应用软件就能改变一个变量,只有使用Public Property Get过程客户才能存取变量。我一直希望能为这种变化找一个可以接受的理由,但我找不出来。

  微软表示将使VB实现"现代化",它在许多方面都做得很好,但仍然有一些问题使我感到困惑。例如,While...Wend语句很早以前就应该取消了,因为Do...Loop语句就可以完成相应的功能,微软并没有抛弃While...Wend,而是将它令人困惑地改成了While... End语句。

  我最不喜欢的变化是:微软改变了我们已经习惯了的数据类型的含意。在.NET中,Integer类型的数据是32位的,Long型数据是64位的,我不敢想象开发人员会在使用变量时出什么样的错误,API调用的是16位的整数还是32位的整数呢?天呀!我希望微软能重新考虑这个决定。创建一些新的变量类型,例如Int32和Long64。难道微软会强迫我们重新学习常见的数据类型?

  一个最需要的变化:VB.NET引入了Option Strict关健字,在可以使用Option Explicit的地方就可以使用它。Option Strict语句取代了Evil Type Coercion(tm),这个语句可以使一个数字转换为一个字符串或完成其他的数据类型转换任务,Setting Option Strict可以让Visual Basic.NET不完成任何强制类型转换。请注意VB.NET并不能完全控制数据类型的转换,它只能向"下"而不能向"上"转换数据类型。例如,如果不使用一个语句明确地指出,就不能将一个定义为Single类型的变量的值赋给一个Double类型的变量,否则就有丢失数据的危险。但是,可以把Double类型变量的值设定为一个Single变量的值而不会有丢失数据的危险。Option Strict可以使开发人员减少许多数据类型方面的错误,包括许多极难调试的错误。另外还有一点需要提醒你:如果在一个项目中使用了Option Strict,就不能再完成后联编了。

[责任编辑:editor]

上一篇:窗体和新的IDE