.NET 應用程式在 CLR 託管環境執行:
循環參考完全無問題:GC 掃描可達性而非引用計數。DataSet 內部複雜雙向參考(DataTable↔DataRow↔DataColumn)GC 輕鬆處理。
// C++:確定性解構,離開作用域即釋放
class CriticalSection {
public:
CriticalSection() { EnterCriticalSection(); }
~CriticalSection() { LeaveCriticalSection(); }
};
void Func() { CriticalSection cs; /* 工作 */ } // 確定釋放
// C#:解構函數非確定性,何時執行不可知
class CriticalSection : IDisposable {
public CriticalSection() { Enter(); }
public void Dispose() { Leave(); }
~CriticalSection() { Dispose(); } // 保底,非確定
}
void Func() { using (var cs = new CriticalSection()) { /* 工作 */ } } // 正確用法
僅作「保底」:使用者忘記 Dispose() 時,最終由 GC 執行釋放非受控資源。不可用於釋放受控資源(可能已被 GC 回收)。
GC.SuppressFinalize 關鍵作用using 陳述式最佳實務