在.Net中,資源回收主要是指記憶體管理和非託管資源的釋放。分別提供了兩種主要的方式進行處理:
- 垃圾回收(GC)
- 確認性資源釋放(DRD)
官網相關文件的連結:https://learn.microsoft.com/zh-cn/dotnet/standard/managed-code
垃圾回收(Garbage Collection)
垃圾回收是.NET執行時自動處理記憶體管理的一種機制。它負責檢測不再被應用程式使用的物件,並釋放這些物件佔用的記憶體
特點:
- 自動執行,不需要開發者顯性呼叫
- 當記憶體不足時觸發
- 釋放託管記憶體(即透過.NET內村分配的記憶體)
- 不保證立即釋放記憶體,而是根據記憶體壓力情況週期性地進行
垃圾回收的侷限性:
- 無法處理非託管資源,如檔案控制代碼、資料庫連結、圖形裝置介面(GDI)物件等
- 可能會導致應用程式出現短暫的暫停(GC暫停)
確定性資源釋放
對於非託管資源,.NET提供了確定性的資源釋放機制,通常透過IDisposable
介面實現。
IDsposable介面:
- 當一個物件實現了
IDsposable
介面,意味著它持有需要手動釋放的資源 - 實現
IDsposable
的物件必須重寫Dispose
方法來清理非託管快取
使用using
語句:
- 使用
using
語句來自動釋放實現IDsposable
的物件所持有的資源 using
語句確保即使在發生異常的情況下,Dispose
方法也會被呼叫
例項中,StreamReader
實現了IDsposable
介面。透過使用using
語句,當StreamReader
物件超出作用域時,Dispose
方法會被自動呼叫,從而釋放檔案控制代碼。
using System;
using System.IO;
class Program
{
static void Main()
{
// 使用 using 語句來自動釋放 StreamReader 的資源
using (StreamReader reader = new StreamReader("example.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
// 如果沒有使用 using 語句,需要手動呼叫 Dispose
// StreamReader reader = new StreamReader("example.txt");
// try
// {
// string line;
// while ((line = reader.ReadLine()) != null)
// {
// Console.WriteLine(line);
// }
// }
// finally
// {
// reader.Dispose();
// }
}
}