雖然編程在一個存在的類,我注意到,有人寫這樣的事情:在自己的使用塊中處理對象是不是多餘的?
using(DisposableObject disp = new DisposableObject())
{
...
...
disp.Dispose()
}
然後我想:是不是使用塊足夠處置的對象?在這種情況下,Dispose()可能有用嗎?
因爲它沒有任何意義,我...
雖然編程在一個存在的類,我注意到,有人寫這樣的事情:在自己的使用塊中處理對象是不是多餘的?
using(DisposableObject disp = new DisposableObject())
{
...
...
disp.Dispose()
}
然後我想:是不是使用塊足夠處置的對象?在這種情況下,Dispose()可能有用嗎?
因爲它沒有任何意義,我...
在你情況下,它沒有用,因爲當using
語句的範圍結束時會自動調用dispose
使用dispose
內using
。這就是爲什麼你只能寫出實現IDisposable
接口在using
括號內的對象。
using(.......)
此外,它有使用disp
對象disp.Dispose()
後它會因爲那時對象將被設置,即它的存儲器已被釋放給錯誤的任何語句。
但要注意
如果dispose
是最後一行using
範圍結束前,那麼它是沒有用的。
但是,在dispose
之後有更多行時,它並不是無用的。
using
就夠了。沒有理由撥打Dispose
兩次。
是的,使用塊實際上是等同於和替代語法:
var d = new DisposableObject();
try
{
d.DoSomething();
}
finally
{
if(d != null)
((IDisposable)d).Dispose();
}
注意,它使用的最後的東西,而不是像「抓」。 finally子句將始終執行,即使有異常。
有幾個原因,你可以使用一個處置利用塊內部兩方面的原因:
Dispose
更清楚你在做什麼。這是典型的,即事務範圍:
using(TransactionScope ts=new TransactionScope)
{
...
if (cond)
{
ts.Complete();
}
else
{
ts.Dispose(); // makes it clear you're rolling back the transaction
}
}
這次調用Dispose
它不是neccesary,但它的 「解釋」。它使得交易回滾更加容易。
@Nikhil Agrawal是對的。我需要提到的一件事是,當你實現Idisposable接口時,你應該確保它可以被調用很多次。這意味着你應該做一些驗證。
+1,正確的答案。 –
這就是我想的......我想我應該在這裏告訴別人這件事 –