2014-02-19 36 views
3

這是我第一次使用嵌套using。我做對了嗎? 下面是代碼:嵌套使用一個好主意

public Boolean AddToDigitalAssets(string fileName) 
{ 
    ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 
    Boolean result = true; 
    using (SqlConnection cnn = new SqlConnection(_ConnectionString)) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 
      using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
      { 

      } 
     } 
    } 
    return result; 
} 
+0

是的,沒有錯。效果很好。 –

回答

4

是的,它是完全Valid和良好做法。

,你甚至可以刪除柯利括號爲首先使用塊如下:

using (SqlConnection cnn = new SqlConnection(_ConnectionString))    
using (SqlCommand cmd = new SqlCommand()) 
{ 

} 
2

using塊「保處置資源的...即使在未處理的異常的情況下。」

用一粒鹽來「保證」。許多事情可以阻止資源的處置。如果使用塊包含無限循環會怎麼樣?或者塊拋出一個異常,堆棧上的惡意異常過濾器進入無限循環,並且永遠不會將控制權返回給與using語句關聯的finally塊?或者塊調用Environment.FailFast?有很多很多事情可以阻止垃圾的運轉。切勿編寫依賴處置的程序來保證其正確性。處置是爲了禮貌,爲了讓其他人使用它們而返回稀缺資源。此外,讓我確定這一點是明確的:真正未處理的異常是C#中的實現定義的行爲。使用塊的finally子句用於處理在使用塊內拋出異常然後在其他位置處理異常的情況,而不是處理在塊內拋出異常並且從不處理的情況。如果發生這種情況,那麼完全取決於實施來確定發生了什麼; C#語言對引發永遠不會處理的異常的程序的行爲總是做出零承諾。資源可能會被處置。他們可能不會。你正在一棟即將被意外拆除的建築物中;你真的想花時間洗碗,並整齊地把它們放在一邊嗎?

對多個嵌套使用塊有沒有好處?

是的。

單個使用塊是否已經保證它所包含的所有資源都將被丟棄?

不。只有使用語句實際提到的資源纔會被清理。這就是爲什麼你要嵌套它們。

在技術上有幾種情況您不必因爲內部人員負責釋放與外部資源相同的資源。但是它不會損害任何使用塊嵌套的東西,並且它使得讀者很清楚發生了什麼。這裏的最佳實踐是爲每個需要清理的資源使用一個使用語句。

相關問題