深入解析 Finalize 內部運作:GC 將有終結器的物件放入終結器佇列,由專用執行緒執行,導致物件至少存活兩代 GC 才能回收,效能較差。
public class MyResourceRelease : IDisposable {
private bool _alreadyDisposed = false;
protected virtual void Dispose(bool isDisposing) {
if (_alreadyDisposed) return;
if (isDisposing) { /* 釋放受控資源 */ }
/* 釋放非受控資源 */
_alreadyDisposed = true;
}
public void Dispose() { Dispose(true); }
}
public class MyDerivedResource : MyResourceRelease {
private bool _disposed = false;
protected override void Dispose(bool isDisposing) {
if (_disposed) return;
try {
if (isDisposing) { /* 釋放衍生類受控資源 */ }
/* 釋放衍生類非受控資源 */
_disposed = true;
} finally { base.Dispose(isDisposing); }
}
}
缺點:呼叫端必須顯式呼叫 Dispose() 或使用 using,否則非受控資源洩漏。