关于vb.net释放端口的信息( 二 )


因为非托管资源一定要被保障正确释放所以我们要定义一个Finalizer来避免程序员忘了调用Dispose的情况 。上面的设计就采用了这种形式 。如果我们手动调用Dispose方法就没有必要再保留Finalizer了,所以在Dispose中我们用了GC.SupressFinalize 将对象从Finalizer表去掉,这样再回收时速度会更快 。
那么那个disposing和"托管类"是怎么回事呢?是这样:在"托管类"中写所有你想在调用Dispose时让其处于可释放状态的托管代码 。还记得我们说过我们不知道托管代码是什么时候释放的吗?在这里我们只是去掉成员对象的引用让它处于可被回收状态,并不是直接释放内存 。在"托管类"中这里我们也要写上所有实现了IDisposable的成员对象,因为他们也有Dispose,所以也需要在对象的Dispose中调用他们的 Dispose,这样才能保证第二个准则 。disposing是为了区分Dispose的调用方法,如果我们手动调用那么为了第二个准则"托管类"部分当然得执行,但如果是Finalizer调用的Dispose,这时候对象已经没有任何引用 , 也就是说对象的成员自然也就不存在了(无引用),也就没有必要执行"托管类"部分了,因为他们已经处于可被回收状态了 。好了,这就是IDisposable接口的全部了 。现在让我们来回想一下,以前我们可能认为有了 Dispose内存就会马上被释放,这是错误的 。只有非托管内存才会被马上释放 , 托管内存的释放由GC管理,我们不用管 。
vb.net怎么把对象真正的立即释放掉.NET目前的垃圾回收机制不能实现把对象真正的立即释放掉,GC会对垃圾进行管理,如果垃圾没有引用计数了,就会被回收 。
编码的时候能用托管类尽量用托管类去实现你的功能 , 
对于实现了IDisposable接口的类 , 用完了记得调用close或者Dispose又或者相应的方法去释放资源 , 最好吧使用using语句块;
对于Com对象,用完了先关闭,然后调用Runtime.InteropServices.Marshal.FinalReleaseComObject()方法把Com对象的引用计数设置为0 。当 COM 对象的引用计数变为 0 时,通常会释放 COM 对象,不过这取决于 COM
对象的实现,而不是运行时可以控制的 。最后调用ComObj = Nothing以释放ComObj持有的引用 。不过要注意 , 只有当ComObj的生存期相对于垃圾回收器用于检测孤立对象的时间来说很长时,你才应该将变量设置为 Nothing 。
有部分来自MSDN
vb.net释放端口的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于、vb.net释放端口的信息别忘了在本站进行查找喔 。

推荐阅读