class MyReSourceWrapper:IDisposable { private bool disposed = false; ~MyReSourceWrapper() { //在这里清除非托管资源 CleanUp(false); Console.WriteLine("******* In Finalize!*******");//仅仅为了测试 //不要调用任何对象的Dispose() } public void Dispose() { //在这里清除资源 CleanUp(true); Console.WriteLine("******* In Dispise!*******");//仅仅为了测试 //如果用户调用Dispose()就不需要终结,因此跳过终结 System.GC.SuppressFinalize(this); } private void CleanUp(bool disposing) { //保证还没有被处置 if (!this.disposed) { if (disposing) { //释放托管的资源 } //释放非托管资源 } this.disposed = true; } }
class Program { static void Main(string[] args) { MyReSourceWrapper rw1 = new MyReSourceWrapper(); rw1.Dispose();//手动调用Dispose(),这不会调用终结器 using (MyReSourceWrapper rw2 = new MyReSourceWrapper()) { }//当使用支持IDisposable接口的.net类型时,这个句法结构将保证退出Using块时, //“正在使用的”对象将自动调用Dispose()方法 MyReSourceWrapper rw3 = new MyReSourceWrapper(); } }