2012-05-21 38 views
1

雖然編程在一個存在的類,我注意到,有人寫這樣的事情:在自己的使用塊中處理對象是不是多餘的?

using(DisposableObject disp = new DisposableObject()) 
{ 
    ... 
    ... 

    disp.Dispose() 
} 

然後我想:是不是使用塊足夠處置的對象?在這種情況下,Dispose()可能有用嗎?

因爲它沒有任何意義,我...

回答

4

在你情況下,它沒有用,因爲當using語句的範圍結束時會自動調用dispose使用disposeusing。這就是爲什麼你只能寫出實現IDisposable接口在using括號內的對象。

using(.......) 

此外,它有使用disp對象disp.Dispose()後它會因爲那時對象將被設置,即它的存儲器已被釋放給錯誤的任何語句。

但要注意

如果dispose是最後一行using範圍結束前,那麼它是沒有用的。

但是,在dispose之後有更多行時,它並不是無用的。

+0

+1,正確的答案。 –

+0

這就是我想的......我想我應該在這裏告訴別人這件事 –

0

using就夠了。沒有理由撥打Dispose兩次。

2

是的,使用塊實際上是等同於和替代語法:

var d = new DisposableObject(); 
try 
{ 
    d.DoSomething(); 
} 
finally 
{ 
    if(d != null) 
     ((IDisposable)d).Dispose(); 
} 

注意,它使用的最後的東西,而不是像「抓」。 finally子句將始終執行,即使有異常。

0

有幾個原因,你可以使用一個處置利用塊內部兩方面的原因:

  • 你想使用塊結束前處置的對象。在這種情況下,使用塊是一個「安全網」,可確保即使發生異常也能丟棄對象。 (使用行爲就像一個嘗試塊,其中有一個終極塊,您的對象被放置)
  • 調用Dispose更清楚你在做什麼。這是典型的,即

事務範圍:

using(TransactionScope ts=new TransactionScope) 
{ 
    ... 
    if (cond) 
    { 
    ts.Complete(); 
    } 
    else 
    { 
    ts.Dispose(); // makes it clear you're rolling back the transaction 
    } 
} 

這次調用Dispose它不是neccesary,但它的 「解釋」。它使得交易回滾更加容易。

0

@Nikhil Agrawal是對的。我需要提到的一件事是,當你實現Idisposable接口時,你應該確保它可以被調用很多次。這意味着你應該做一些驗證。

相關問題