使用非托管資源的類型必須實現IDisposable接口的Dispose()方法來精確的 釋放系統資源。.Net環境的這一規則使得釋放資源代碼的職責是類型的使用者, 而不是類型或系統。因此,任何時候你在使用一個有Dispose()方法的類型時, 你就有責任來調用Dispose()方法來釋放資源。最好的方法來保證Dispose()被調 用的結構是使用using語句或者try/finally塊。
所有包含非托管資源的 類型應該實現IDisposable接口,另外,當你忘記恰當的處理這些類型時,它們 會被動的創建析構函數。如果你忘記處理這些對象,那些非內存資源會在晚些時 候,析構函數被確切調用時得到釋放。這就使得這些對象在內存時待的時間更長 ,從而會使你的應用程序會因系統資源占用太多而速度下降。
幸運的是 ,C#語言的設計者精確的釋放資源是一個常見的任務。他們添加了一個關鍵字 來使這變得簡單了。
假設你寫了下面的代碼:
public void ExecuteCommand( string connString,
string commandString )
{
SqlConnection myConnection = new SqlConnection( connString );
SqlCommand MySQLCommand = new SqlCommand( commandString,
myConnection );
myConnection.Open();
MySQLCommand.ExecuteNonQuery();
}
這個例子中的兩 個可處理對象沒有被恰當的釋放:SqlConnection和SqlCommand。兩個對象同時 保存在內存裡直到析構函數被調用。(這兩個類都是從 System.ComponentModel.Component繼承來的。)
解決這個問題的方法就 是在使用完命令和鏈接後就調用它們的Dispose:
public void ExecuteCommand( string connString,
string commandString )
{
SqlConnection myConnection = new SqlConnection( connString );
SqlCommand MySQLCommand = new SqlCommand( commandString,
myConnection );
myConnection.Open();
MySQLCommand.ExecuteNonQuery();
MySQLCommand.Dispose( );
myConnection.Dispose( );
}
這很好,除非SQL命令在執 行時拋出異常,這時你的Dispose()調用就永遠不會成功。using語句可以確保 Dispose()方法被調用。當你把對象分配到using語句內時,C#的編譯器就把這 些對象放到一個try/finally塊內:
public void ExecuteCommand( string connString,
string commandString )
{
using ( SqlConnection myConnection = new
SqlConnection( connString ))
{
using ( SqlCommand MySQLCommand = new
SqlCommand( commandString,
myConnection ))
{
myConnection.Open();
MySQLCommand.ExecuteNonQuery();
}
}
}