2012-03-02 138 views
5

哪一個更好從以下選項C#使用關鍵字,正確使用它

是一個使用語句就夠了嗎?

選項1:

using(SqlConnection con = new SqlConnection(constring)) 
{ 
    using(SqlCommand cmd = new SqlCommand()) 
    { 
     ......................... 
     ......................... 
     ......................... 
    } 
} 

選項2:

using(SqlConnection con = new SqlConnection(constring)) 
{ 
    SqlCommand cmd = new SqlCommand(); 
    ......................... 
    ......................... 
    ......................... 
} 
+0

可能重複的[是SqlCommand.Dispose()如果關聯的SqlConnection將佈置需要?](http://stackoverflow.com/questions/1808036/is-sqlcommand-dispose-required-if-associated- sqlconnection-will-be-dispos) – 2012-03-02 18:11:16

回答

15

這是一般最簡單的遵循規則, 「如果類型實現IDisposable然後用using結構。」所以我會選擇某種形式的選項1.

1

不,按照經驗法則,每次實例化IDisposable時,都不足以包含在使用塊中。

1

當你有多個時,最好使用兩個使用命令(雖然有alternative syntaxes)。垃圾收集最好是明確何時需要訪問這些資源。

+0

是什麼讓你認爲'IDisposable'或'using(...)'與垃圾收集器有什麼關係? – asawyer 2012-03-02 18:03:40

+2

@asawyer在這兩種情況下,我想我們正在處理清除記憶。 – Mubarek 2012-03-02 18:37:18

2

第一個肯定比較好。

即使連接和命令之間存在一個使得外層足夠的關係,您不希望依賴於此,或者期望您的讀者知道。

而這種關係永遠不會被記錄下來,並可能在未來的版本中發生變化。

+0

你能否澄清一下「即使連接和命令之間存在關係」。謝謝 – Mubarek 2012-03-02 18:40:24

+0

命令需要連接,當您關閉連接時,您永遠不會保持服務器上的資源。雖然連接池可能會使其不太清楚。另請參閱TextReader和Stream。 – 2012-03-02 19:32:04

9

您需要將它們都包裹起來,儘管如果這會讓您感到困擾,您可以使它看起來更整潔一些!

using (var conn = new SqlConnection(/* ... */)) 
using (var cmd = new SqlCommand(/* ... */)) 
{ 
    // ... 
}