某个时候怀念VB

来源:互联网 发布:天猫 淘宝商城母婴 编辑:程序博客网 时间:2024/04/29 01:27

 很多人都记得,甚至很好地利用过VB的对象计数的一些优点,其实不应该说是VB,应该是COM接口引用计数的优点,现在的DotNet自动管理对象的释放,很大程度降低了相互引用而无法释放内存的问题,通常由GC直接接管即可。
当然,引用计数也不是一无是处的,毕竟也存活且大大地占有了市场很多年,有个简单例子,即Mouse的MousePointer的例子:当点击按钮(button)时,程序执行一段代码,在执行时希望显示Busy的MousePointer,执行完毕后恢复原样。
这在VB是非常简单的,只要创建一个Class,在initialize时设置窗体的MousePointer为Hourglass,在Terminate中恢复。

此外,大家可以参考POWER VB一书,里面有一个更简单的例子。
可在Dotnet中并行不通,大家通常是在代码段执行前设置为Busy,然后在最后的执行点恢复为Default,而且为了保证能够正常恢复,通常还写在try catch finally的finally块中。

可以说非常不方便,当然Dotnet提供了using语句,可以模拟类似自动释放的行为类继承于IDisposable接口即可。
但本人认为还是非常不方便的,原因有2
原因1:我们仅仅控制MousePointer吗,答案通常是否定的,比如点击Button,我们通常还控制相应的Button或其他控件或整个窗体的使能状态,最后恢复,这是为了防止多次点击,多次触发事件
原因2:可能有更复杂的情况,其他对象的状态控制,不单单是控件的使能。

为了简化此问题,最大程度地实现Dispose和Dispose的行为,本人设计了一个简单的类,雕虫小技,以求抛砖引用
在Dotnet中,据我目前所知,不使用显式Dispose,是无法向COM一样立即释放引用计数为0的对象的,显示使用Dispose通常为
1.调用Dispose本身
2.using语句,using语句其实就是try catch finally dispose 的简化,编译后是一样的,大家可以通过Reflector去验证。

闲话少说,直接送上代码
例子1

调用

以上是基本原理,通过扩充可以显示更多的效果
例2

调用2

作者:Superlight

原创粉丝点击