iT邦幫忙

2026 iThome 鐵人賽

DAY 20
0
自我挑戰組

學習C#續系列 第 20 篇

Day 20:資源釋放與記憶體管理

  • 分享至 

  • xImage
  •  

託管資源(Managed)與非託管資源(Unmanaged):

  • 託管資源:由 CLR 完全控管的記憶體物件(如 string、自訂 class、陣列)。當沒有任何變數參考時,由垃圾回收器自動回收。
  • 非託管資源:作業系統原生資源(如檔案控制代碼、資料庫連線、網路通訊埠、GDI 繪圖控制代碼)。垃圾回收器不會主動且即時地清理這些資源,必須由開發者手動釋放。

垃圾回收器(Garbage Collector, GC)基本概念:

  • 世代回收(Generational GC):
    • 第 0 代(Gen 0):新建立的短命物件,回收頻率最高、速度最快。
    • 第 1 代(Gen 1):經過一次 GC 後存活下來的物件,作為緩衝過渡區。
    • 第 2 代(Gen 2):長期存活的長命物件(如靜態物件、大型常駐快取),回收成本最高。
  • 不確定性(Non-deterministic):GC 觸發的時機由系統依記憶體壓力決定,無法預測確切被回收的秒數。

IDisposable 介面與 Dispose 模式:

  • 當類別持有非託管資源或包裝了需提早關閉的資源時,應實作 IDisposable。
  • 介面只定義一個無參數的方法:void Dispose()。
  • 標準清理範式:
    • 於 Dispose() 中釋放資源,並設定標記防範重複釋放。
    • 呼叫 GC.SuppressFinalize(this):通知 GC 此物件已被手動清理完畢,不需要再排入終結佇列(Finalization Queue),提高系統效能。

using 陳述式:

  • 本質為語法糖,編譯後會自動轉譯為標準的 try-finally 結構。
  • 保證釋放:只要物件實作了 IDisposable,即使區塊內發生例外或提前 return,在離開作用域時一定會強制呼叫該物件的 Dispose()。

實作範例

https://ithelp.ithome.com.tw/upload/images/20261003/201789256J4waSDmVh.png

https://ithelp.ithome.com.tw/upload/images/20261003/20178925c52n9SY2Fd.png

https://ithelp.ithome.com.tw/upload/images/20261003/201789250W6TJ7JsIf.png

https://ithelp.ithome.com.tw/upload/images/20261003/20178925PIzLjupL9I.png


上一篇
Day 19: 擴充方法(Extension Methods)與現代模式比對(Pattern Matching)
系列文
學習C#續 共 20 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言