1. 程式人生 > WINDOWS開發 >C# 託管資源與非託管資源(自己總結)

C# 託管資源與非託管資源(自己總結)

其實我的關注點是哪些需要手動的去釋放資源。

包括:比如檔案流、影象圖形類、資料庫的連線,網路連線,系統的視窗控制代碼,印表機資源等,這類資源一般不存在堆上。可以認為作業系統資源的一組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;
}
}