2009-02-04 96 views
3

如果我使用類似:使用語句是否阻止我關閉或銷燬對象?

using (OdbcConnection conn = new OdbcConnection(....)) 
{ 
    conn.open(); 
    my commands and sql, etc. 
} 

我必須做一個conn.close();還是使用聲明讓我無法完成最後一次呼叫?它是否處理使用塊中的所有內容?例如,如果我稱其他對象不相關,它會自動將這些對象與其他對象相關聯嗎?

謝謝。在閱讀關於在微軟網站上使用的內容後,我並不清楚。我想確保我沒有任何內存泄漏。

回答

6
  1. 使用塊將處置OdbcConnection。
  2. 正常範圍規則適用於在使用塊內聲明的任何內容。
  3. 使用塊不會清除任何其他IDisposable對象。它只是清理聲明的項目
    • 請注意,您可以使用塊嵌套,或者如果項目是相同的類型,可以同時初始化多個項目。

多一點信息,請參閱我的其他答案的最高位爲How do I use the using keyword in C#

我還應該提到,只要您完成了釋放資源,就可以關閉(處置)連接。準則指出,調用者應該能夠重複調用處置方法。使用塊本質上只是一個安全網,並且允許在大多數情況下編寫更清晰的代碼。


[編輯] 例如多個初始化在一個使用:在使用相同的初始化多於一個的對象,而無需使用塊,如果對象是同一類型的具有嵌套:

using (Bitmap b1 = new Bitmap("file1"), b2 = new Bitmap("file2")) 
{ ... } 

喬爾Coehoorn提到堆疊,其被嵌套,但省略了括號,多因爲您可以省略forif聲明中的大括號。用戶界面不會重新格式化縮進。我很好奇IL的樣子。

using(Bitmap b = new Bitmap("filex")) 
using(Graphics g = Graphics.FromImage(b)) 
{ 
} 

這是一個錯誤使用把不同的對象在相同的使用error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement.

// error CS1044 
using(Bitmap b = new Bitmap("filex"), Graphics g = Graphics.FromImage(b)) 
+0

他們甚至不必是相同的類型:您可以「堆疊」多用statments在一起(創建例如同一級別的連接和命令對象),以避免創建深層嵌套的作用域。 – 2009-02-04 21:47:08

1

using語句確保了其實現IDisposable一個對象被設置。它只會出售的是在使用塊referened的對象,以便您的代碼基本上equivlant到:

OdbcConnection conn = new ....; 
try 
{ 
    conn.open(); 
    conn..... 
} 
finally 
{ 
    conn.dispose(); 
}