C# 託管資源與非託管資源(自己總結)
阿新 • • 發佈:2020-04-21
其實我的關注點是哪些需要手動的去釋放資源。
包括:比如檔案流、影象圖形類、資料庫的連線,網路連線,系統的視窗控制代碼,印表機資源等,這類資源一般不存在堆上。可以認為作業系統資源的一組API。具體可以參考MSDN
我的理解是主要有兩種情況:
一、這些需要手動釋放資源的變量出現在類的方法裡,當方法結束的時候需要去手動或顯示的釋放這些資源。比如下邊程式碼,通過用using 顯示釋放資源
using(SqlConnection conn = new SqlConnection())
{
//do something;
}
c#使用using簡化輸入,編譯器自動翻譯成try...finally,等同於下面寫法
SqlConnection conn = new SqlConnection();
try
{
//do something;
}
finally
{
conn.Dispose();
}
使用using要求後邊的例項必須實現IDisposable介面
二、這些需要手動釋放資源的變量出現在類的欄位裡,這時候需要讓這個類實現IDisposable介面,程式別的地方用到這個類例項的時候,就可以通過呼叫例項的Dispose()來顯示的釋放資源
標準清理模式,程式碼如下:
MyClass:IDisposable
{
private bool disposed = false;
~MyClass()
{
Dispose(false);
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if(disposed == false)
{
if(disposing == true)
{
// 釋託管程式碼
......
}
// 釋非程式碼
......
}
disposed = true;
}
}