2017-04-21 45 views
0

我在c#中使用「using」關鍵字。使用關鍵字進行連接配置嵌套。

using(SqlConnection sourceConnection = new SqlConnection()) 
{ 
    sourceConnection.Open(); 
    var destinationConnection = new SqlConnection(); 
    destinationConnection.Open(); 

} 

在上面的代碼行是連接將處置或只有sourceConnection()將處置。

回答

3

只有sourceConnection,即包裝在using聲明中的對象將被丟棄。您應該使用其他using語句,以確保destinationConnection也設置:

using (SqlConnection sourceConnection = new SqlConnection()) 
using (var destinationConnection = new SqlConnection()) 
{ 
    sourceConnection.Open(); 
    destinationConnection.Open(); 

} 
2

只有其中一人將被放置,你從來沒有明確的usingdestinationConnection調用Dispose或包裹。

你可以做到這一點,並且兩者都會一直處置。

using(SqlConnection sourceConnection = new SqlConnection()) 
{ 
    using(SqlConnection destinationConnection = new SqlConnection()) 
    { 
    } 
} 
3

usingIDisposable接口上運行。忽略變量的範圍,它基本上有點像這樣:

SqlConnection sourceConnection = new SqlConnection(); 
try 
{ 
    sourceConnection.Open(); 
    var destinationConnection = new SqlConnection(); 
    destinationConnection.Open(); 
} 
finally 
{ 
    if (sourceConnection != null) 
    { 
     sourceConnection.Dispose(); 
    } 
} 

所以在回答你的問題,它只會關閉一個。

從MSDN經由this post由Robert小號:

C#,通過.NET Framework公共 語言運行庫(CLR),使用自動 釋放存儲器以存儲不再需要的 對象。 內存的釋放是 非確定性;每當CLR決定執行 垃圾回收時,內存將被釋放。然而,它通常是最好的釋放有限的 資源,如文件句柄和 網絡連接儘可能快地 。

using語句允許程序員 指定使用資源的對象 應該釋放 它們。提供給使用 語句的對象必須實現 IDisposable接口。此接口 提供Dispose方法,其中 應釋放對象的資源。

這又表明它只對一個對象起作用:使用的主題。

2

正如一些人已經指出,using包裹IDisposable接口,如:

using (var foo = new MyDisposable()) { ... } 

是一樣的:

var foo = new MyDisposable() 
try { 
    ... 
} 
finally { 
    if (foo != null) { foo.Dispose(); } 
} 

到目前爲止好。 C#實現此目的的原因是因爲非託管資源。爲什麼?非託管資源要求您在需要的時候清理垃圾,而不是垃圾收集器(GC)需要的時間(當內存用完時f.ex.)。

考慮暫時的替代方案:假設您有一個文件。您打開文件,寫入一些字節,忘記'關閉',然後沒有IDisposable來關閉它。即使您不再使用該對象,您的文件仍將繼續打開。更糟糕的是,如果您的程序退出,您甚至不知道數據已寫入。如果你的程序運行時間足夠長,在某些時候GC可能會爲你啓動並刪除它,但在此之前,所有其他試圖打開該文件的嘗試都可能會給你一個很大的錯誤。所以,總之...:很多痛苦和痛苦。

這就是IDisposable解決的問題。

連接,文件,內存訪問,網絡訪問......基本上所有使用需要清理的東西都實現了IDisposable。它甚至成立,如果類型實現IDisposable,你最好解決它。

所以... SQL連接實現IDisposable,SQL讀取器實現IDisposable等等。就我個人而言,我傾向於檢查每種類型的IDisposable接口的存在,然後再使用它(所以是的:所有的時間)。

一旦你理解了這一點,正確的使用方法,這一切都是顯而易見的:

using (var sourceConnection = new SqlConnection()) 
{ 
    sourceConnection.Open(); 
    using (var destinationConnection = new SqlConnection()) 
    { 
     destinationConnection.Open(); 

     // ... 
     using (var myReader = srcConnection.ExecuteReader(...)) 
     { 
      // ... 
     } 
    } 
} 

...等等。

現在,在某些情況下,您顯然不能使用using,因爲您使用的是不同的方法。如何解決這個問題?簡單:在具有這些方法的類中實現Dispose模式。更多信息(以及處理模式):https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx