/// <summary> /// Dispose Pattern /// </summary> /// <remarks> /// 由邏輯可知: /// 1.不管是手動調用Dispose方法還是系統自動調用析構函數,均會執行【非託管資源】釋放程序 /// 2.系統自動調用析構函數時,不會執行【託管資源】釋放程序 /// </remarks> public class DisposableObject : IDisposable { /// <summary> /// 獲取或設置一個值。該值指示資源已經被釋放。 /// </summary> private bool _disposed; /// <summary> /// 執行與釋放或重置非託管資源相關的應用程序定義的任務。 /// </summary> public void Dispose() { Dispose(true); // 指示GC不要調用此對象的Finalize方法 GC.SuppressFinalize(this); } /// <summary> /// 關閉此對象使用的所有資源。 /// </summary> /// <remarks> /// 1.有時候特定的名稱比Dispose更合適,比如文件封裝,網絡連接封裝等 /// 2.此方法不要設計爲 virtual,子類不應該重寫該方法。 /// </remarks> public void Close() { Dispose(); } /// <summary> /// 由終結器調用以釋放資源。 /// </summary> ~DisposableObject() { Dispose(false); } public void DoSomething() { if (_disposed) throw new ObjectDisposedException("無法訪問已經釋放的資源。"); // TODO somethings } /// <summary> /// 執行與釋放或重置非託管資源相關的應用程序定義的任務。 /// 派生類中重寫此方法時,需要釋放派生類中額外使用的資源。 /// </summary> protected virtual void Dispose(bool disposing) { if (_disposed) { return; } if (disposing) { // TODO 清理託管資源 } // TODO 1.清理非託管資源 2.將大對象設置爲null _disposed = true; // 標記已經被釋放。 } }