public class CDisposable : IDisposable { //析構函數,編譯后變成 protected void Finalize(),GC會在回收對象前會調用調用該方法 ~CDisposable() { Dispose(false); } //通過實現該接口,客戶可以顯式地釋放對象,而不需要等待GC來釋放資源,據說那樣會降低效率 void IDisposable.Dispose() { Dispose(true); } //將釋放非托管資源設計成一個虛函數,提供在繼承類中釋放基類的資源的能力 protected virtual void ReleaseUnmanageResources() { //Do something... Console.WriteLine("Do something... "); } //私有函數用以釋放非托管資源 private void Dispose(bool disposing) { ReleaseUnmanageResources(); //為true時表示是客戶顯式調用了釋放函數,需通知GC不要再調用對象的Finalize方法 //為false時肯定是GC調用了對象的Finalize方法,所以沒有必要再告訴GC你不要調用我的Finalize方法啦 if (disposing) { GC.SuppressFinalize(this); } }
public static void ShowResults() { //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); int sms = Environment.TickCount; Console.WriteLine(sms.ToString()); int i = 0; while (i < 100) { //tmpObj1沒有手工釋放資源,就等着GC來慢慢的釋放它吧 CDisposable tmpObj1 = new CDisposable(); i++; } int mms = Environment.TickCount; Console.WriteLine(mms - sms); //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); i = 0; while (i < 100) { Console.Write(" "); //tmpObj2調用了Dispose方法,傳說比等着GC來釋放它效率要調一些 //個人認為是因為要逐個對象的查看其元數據,以確認是否實現了Dispose方法吧 //當然最重要的是我們可以自己確定釋放的時間以節省內存,優化程序運行效率 CDisposable tmpObj2 = new CDisposable(); ((IDisposable)tmpObj2).Dispose(); i++; } int ems = Environment.TickCount; Console.WriteLine(ems - mms); //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); }