WEB开发网
开发学院软件开发C语言 C#.Net中的非托管代码清理 阅读

C#.Net中的非托管代码清理

 2009-04-04 08:22:51 来源:WEB开发网   
核心提示: Finalize方式:通过对自定义类型实现一个Finalize方法来释放非通过资源.从.net2.0开始,C#编译器不能对Finalize进行显示的调用和重写,C#.Net中的非托管代码清理(2),必须使用析构函数来实现它.class A { ~

Finalize方式:通过对自定义类型实现一个Finalize方法来释放非通过资源.

从.net2.0开始,C#编译器不能对Finalize进行显示的调用和重写,必须使用析构函数来实现它.

class A
{
~A()
{
释放资源;
}
}

上面的代码就是通过Finalize方式来释放资源的跟C++用析构函数释放资源的代码很象.

但是它实现方式和C++不同,因为它是由垃圾回收器来管理内存的.

大家看到了,用Finalize方式释放非托管资源很简单,但是如果你了解了他的实现方式,你可能就不会选择用它来释放非托管资源.

那Finalize方式在.net内部是如何实现的呢?

当GC(垃圾回收器)开始工作的时候,它首先将没有终结器的垃圾对象从内存中移除,有终结器的所有对象则添加到一个终止化队列当中。GC会调用一个 新线程来执行这些对象的终结器。当终结器执行完毕后,这些对象会从队列中被移除。这时候由于这些对象在第一次检测到的时候没有被释放,它们将会进入第1代 对象,直到GC检测到第0代对象和第1代对象再次充满时,这时候GC才会把刚才那些对象释放掉,所以有终结器的对象会比没有的在内存中保留更长的时间。

提示:垃圾回收器把托管堆中的对象分为3代,分别是0,1,2.一般分配为:0代约256K,1代约是2MB,第2代约是MB,代龄越高,容量就越 大,显然效率也就越低.首先被添加到托管堆中的对象被定为第0代,当第0代充满时,就会执行垃圾回收,未被回收的对象代领将提升1代.

由于以上原因应该避免仅使用Finalize方式释放非托管资源.

Dispose模式:在自定义类中实现IDispose接口,在接口中的Dispose方法中对非托管资源进行释放.闲话少说,上代码

上一页  1 2 3 4  下一页

Tags:Net 托管 代码

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接