首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Effective C# 第二章:.NET 資源管理核心觀念

     編輯:關於C#

.NET 應用程式運行於受控環境,記憶體管理交由垃圾回收器(GC)負責。這與傳統原生環境截然不同:不再手動管理記憶體、無記憶體洩漏、無野指標、無未初始化指標問題。但非受控資源(檔案控制代碼、資料庫連線、GDI+ 物件、COM 物件等)仍由開發者負責釋放。

GC 核心機制

  • 追蹤式回收:從應用程式根節點(堆疊變數、靜態欄位等)遍歷物件圖,標記可達物件,其餘視為垃圾回收。
  • 壓縮堆積:回收後將存活物件搬移至連續記憶體,消除碎片,提升配置速度。
  • 世代機制:第 0 代(臨時變數)、第 1 代、第 2 代(長期存活)。GC 優先掃描第 0 代,大幅降低完整掃描頻率。
  • 獨立執行緒:GC 於背景執行緒運行,不阻塞主執行緒(工作站模式)。

循環參考不再是問題

DataSet 內部擁有複雜雙向參考網(DataTable ↔ DataRow ↔ DataColumn、DataView 等),GC 能正確識別整個圖在根節點斷開後不可達,一次回收。無需手動斷開循環參考。

完成項與非確定性銷毀

C# 無確定性解構函式。完成項(~Class())在 GC 回收前由專用完成項執行緒呼叫,時機不可預測。C++ RAII 模式(建構獲取資源、解構釋放資源)在 C#不適用:

// C++ 風格:危險!
class CriticalSection {
    CriticalSection() { EnterCriticalSection(); }
    ~CriticalSection() { ExitCriticalSection(); } // 何時執行?不可知!
}

完成項延遲導致:

  1. 資源佔用時間不可控(關鍵區段保護失效)。
  2. 效能代價:需完成項的物件最少多存活一個 GC 週期,可能晉升至第 2 代,存活上百個 GC 週期才被回收。
  3. 完成項執行緒序不定,物件間相依關係不可靠。

標準解決方案:IDisposable + Dispose 模式

  • 主動釋放:呼叫端用 using / try/finally 確保 Dispose() 執行。
  • 被動安全網:完成項作為最後防線,釋放非受控資源。
  • GC.SuppressFinalize(this):主動釋放後移除完成項排程,避免效能損失。

核心心法

GC 管記憶體,非受控資源管自己。完成項是代價高昂的安全網,IDisposable 才是正規釋放管道。善用 using,讓資源生命週期可見、可控、高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved