承接上篇 GC 運作模式,深入解析四大關鍵主題與實務模式。
IDisposable,釋放託管與非託管資源。IDisposable 時,衍生類必須 override Dispose(bool) 並呼叫 base.Dispose(disposing)。using 編譯後等同 try-finally,離開區塊自動呼叫 Dispose()(IL 驗證完全一致)。GC.SuppressFinalize(this) 用於 Dispose() 中,避免重複清理成本。GC.ReRegisterForFinalize 可重新註冊 Finalize(罕用)。public class Resource : IDisposable {
bool disposed = false;
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }
protected virtual void Dispose(bool disposing) {
if (!disposed) {
if (disposing) { /* 釋放託管資源 */ }
/* 釋放非託管資源 */
disposed = true;
}
}
~Resource() { Dispose(false); }
}
WeakReference.IsAlive 檢查存活;Target 取得強參考。var so = new SomeObject();
var wr = new WeakReference(so);
so = null;
GC.Collect();
Console.WriteLine(wr.IsAlive); // False (已被回收)
建議大物件快取採用短弱參考,平衡記憶體與重建成本。