在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); }
|
可以看出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(); }
|
现在可以看出using块中的d3是自动释放的,而且也是最先被释放的,所以在在写程序的时候,多用using块是有好处的,呵呵