.net中所有托管资源均有GC自动回收,那非托管资源怎么办呢?
IDisposable接口就是设计用来显示释放非托管资源,如果是直接调用dispose方法,则无需再经由finalizer方法去调用this.Dispose(false)去释放托管资源,所以需在Dispose()方法中加上
GC.SuppressFinalize(this);
以提醒系统无需再调用析构函数,所有托管、非托管资源均会在Dispose(True)方法中释放,否则仍由Finzlizer方法调用Dispose(false)方法以便释放非托管资源,托管资源由GC直接回收
public class MyBaseResourceManager : IDisposable { // Dispose是否被调用 private bool isDisposed = false; protected string Name = "Name"; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!isDisposed) { if (disposing) { //Code to 释放托管资源 } //Code to 释放非托管资源 } isDisposed = true; } // 析构函数只会在我们没有直接调用Dispose方法的时候调用 // 派生类中不用在次提供析构函数 ~MyBaseResourceManager() { Dispose(false); } } public class MyResourceManager : MyBaseResourceManager { private bool disposed = false; protected override void Dispose(bool disposing) { if (!disposed) { try { if (disposing) { //Code To 释放托管资源 } //Code To 释放非托管资源 } finally { base.Dispose(disposing); } } } }
使用Using关键字,即可在using中代码执行结束后自动调用对象mr的dispose方法,如下所示
static void Main() { using (MyResourceManager mr = new MyResourceManager()) { }
参见:http://www.cnblogs.com/carysun/archive/2008/06/15/Dispose.html