程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則15:使用using和try/finally來做資源清理(1)

Effective C#原則15:使用using和try/finally來做資源清理(1)

編輯:關於C語言

使用非托管資源的類型必須實現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();
  }
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved