Finalize和Dispose与析构的区别

在CLR中内存管理的真正工作是由IDisposable接口的Dispose()方法和类的析构函数完成的。当有非托管资源需要释放的时候,通常应该执行Finalize()方法来代替析构函数。
IDisposable是一个接口,它并不局限在C#中,它是Microsoft的COM技术的一部分,它提供的一个用于清理不仅仅是C#内的各种类型的组件的通用机制.类似与IDisposable的接口使得C#适用于.NET框架。IDisposable定义了一个专门的方法,Dispose().

在类中如果有必须被释放的资源,最好的解决方案就是同时使用析构函数和Dispose()方法。
首先看一下CLR中自动回收的效果:

using System;
using System.Text;

class DR{
     int ci;
     public DR(int i){
        this.ci=i;
        Console.WriteLine("DR({0})",this.ci);
     }
}

class DA : IDisposable{
     int n;
     public DA(int n){
        this.n=n;
        DR MyR=new DR(n);  
     } 

     public void Dispose(){
        Console.WriteLine("Dispose({0})",this.n);
        GC.SuppressFinalize(this);
     }

     ~DA(){
        Console.WriteLine("~DA({0})",this.n);
     }
}


class Demo{ 
     public static void Main(string[] args){    
        DA d1=new DA(1);
        DA d2=new DA(2);
        DA d3=new DA(3);    
}

Finalize和Dispose与析构的区别

可以看出CLR里内存管理系统自动按变量进栈的顺序来消除变量。

 

如果我改一下:

using System;
using System.Text;


class DR{
     int ci;
     public DR(int i){
        this.ci=i;
        Console.WriteLine("DR({0})",this.ci);
     }
}

class DA : IDisposable{
     int n;
     public DA(int n){
        this.n=n;
        DR MyR=new DR(n);  
     } 

     public void Dispose(){
        Console.WriteLine("Dispose({0})",this.n);
        GC.SuppressFinalize(this);
     }

     ~DA(){
        Console.WriteLine("~DA({0})",this.n);
     }
}


class Demo{ 
     public static void Main(string[] args){    
        DA d1=new DA(1);
        DA d2=new DA(2);
        DA d3=new DA(3);    
       
        d1=null;
        using(d3){
          DA d4=new DA(4);
        }
        d2.Dispose();
}

 

Finalize和Dispose与析构的区别

 

现在可以看出using块中的d3是自动释放的,而且也是最先被释放的,所以在在写程序的时候,多用using块是有好处的,呵呵

 

上一篇:IT运维管理之自动化运维篇


下一篇:Mono 1.2.5 发布,提供对IronPython和DLR的支持