2011-12-02 60 views
6

很多SO的人指出我應該更頻繁地使用using聲明。所以我在練習。當使用語句應該使用?

問題是我無法決定何時使用它以及何時不使用它。當我想我應該用它,然後我得到的錯誤,如在這個例子中(PS HashPhrase是我創建的類):

 using (HashPhrase hash = new HashPhrase()) 
     { 
      connection.ConnectionString = 
       "Provider=Microsoft.ACE.OLEDB.12.0;" + 
       "Data Source=" + filePath + ";" + 
       "Persist Security Info=False;" + 
       "Jet OLEDB:Database Password=" + hash.ShortHash(pass) + ";"; 
     } 

但它給我一個錯誤:'Password_Manager.HashPhrase': type used in a using statement must be implicitly convertible to 'System.IDisposable'

但在這個例子正常工作:

using (OleDbConnection connection = new OleDbConnection()) 
    { 
     connection.ConnectionString = 
      "Provider=Microsoft.ACE.OLEDB.12.0;" + 
      "Data Source=" + filePath + ";" + 
      "Persist Security Info=False;" + 
      "Jet OLEDB:Database Password=" + hash.ShortHash(pass) + ";"; 

     using (OleDbCommand command = new OleDbCommand(sql, connection)) 
     { 
      try 
      { 
       connection.Open(); 
       command.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error: " + ex.Message); 
      } 
     } 
    } 

是否有任何快速指南如何確定何時使用using聲明?

回答

14

您的問題已經觸及答案。

如果該類型實現了接口IDisposable,那麼您應該儘可能使用using(即始終如此,除非有令人信服的理由)。

如果類型不實現IDisposable那麼你不能使用using,編譯器會告訴你,就像你已經發現的那樣。

+0

這很有道理。 – HelpNeeder

+1

@downvoter:你願意解釋一下downvote的原因嗎? – LukeH

4

只要該類實現接口IDisposable,就應該使用using語句。

這是將對象封裝在try-finally塊中的簡寫形式,以確保始終調用該對象的Dispose方法來釋放任何資源,而不管是否拋出異常。

要檢查,請右鍵單擊Visual Studio中的類名,然後選擇轉至聲明以在對象瀏覽器中將其打開。然後,您可以輕鬆檢查類或其基類型是否實現IDisposable。

+0

+1供參考:) – HelpNeeder

4

using (var r = new R()) 
{ 
    // use r 
} 

R應該實現IDisposing接口。

2

最簡單的方法是查看對象是否實現了IDisposable接口。因此,右鍵單擊相關的對象/類,從下拉列表中選擇Go to Definition(或按F12),並查看該類是否實現了IDisposable。請注意,在實現許多接口/其他類的類中,您可能需要實際檢查這些類以查看它們是否也實現了IDisposable。