最佳實務:同時實作終結器與 IDisposable,並呼叫 GC.SuppressFinalize(this) 避免雙重清理與延遲回收。
public class MyResourceRelease : IDisposable {
~MyResourceRelease() { Dispose(false); }
private bool _alreadyDisposed = false;
protected virtual void Dispose(bool isDisposing) {
if (_alreadyDisposed) return;
if (isDisposing) { /* 釋放受控資源 */ }
/* 釋放非受控資源 */
_alreadyDisposed = true;
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this); // 關鍵:從終結器佇列移除
}
}
派生類別應覆寫 Dispose(bool) 並呼叫 base.Dispose(isDisposing) 確保繼承鏈資源正確釋放。