正如一些人已經指出,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