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

Effective C# 第 2 章:.NET 資源管理(上)

     編輯:關於C語言

託管環境的核心差異

.NET 應用程式在 CLR 託管環境執行:

  • GC 負責記憶體:無記憶體洩漏、野指標、未初始化指標問題
  • 開發者負責非記憶體資源:檔案控制代碼、資料庫連線、GDI+ 物件、COM 物件、網路通訊端

GC 運作原理

  1. 從應用程式根(靜態欄位、區域變數、CPU 登錄器)開始
  2. 沿物件參考圖遍歷(標記階段)
  3. 不可達物件 = 垃圾
  4. 壓縮堆積:移動存活物件產生連續可用記憶體

循環參考完全無問題:GC 掃描可達性而非引用計數。DataSet 內部複雜雙向參考(DataTable↔DataRow↔DataColumn)GC 輕鬆處理。

C++ RAII vs C# 非確定性解構

// 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 影響)
  • IDisposable 完整實作模式
  • GC.SuppressFinalize 關鍵作用
  • using 陳述式最佳實務
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved