在.Net中,資源回收主要是指記憶體管理和非托管資源的釋放。分別提供了兩種主要的方式進行處理: 垃圾回收(GC) 確認性資源釋放(DRD) 官網相關文檔的鏈接:https://learn.microsoft.com/zh-cn/dotnet/standard/managed-code 垃圾回收(Gar ...
在.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();
// }
}
}