2017-07-05 25 views
1

我的問題相當簡單:如果實現IDisposable的類具有也是一次性的字段,那麼處置該實例是否也會處理字段值?一次性類的一次性字段是自動處理的

例子:

說我有一個類,OuterDisposable,其中有一個領域innerDisposable,誰的類型是另一種一次性類:

public class OuterDisposable : IDisposable 
{ 
    private InnerDisposable innerDisposable; 
} 

我打算換的OuterDisposable所有實例using聲明,以便它們自動安全地處置:

using (var outerDisposable = new OuterDisposable()) 
{ 
    // Stuff 
} 

但是,我不確定一旦達到using的末端,innerDisposable會發生什麼情況。正確處置它是非常重要的,所以我需要確定行爲是什麼。

我相信明確處置innerDisposable會實現我想要的結果:

public void Dispose() 
{ 
    this.innerDisposable.Dispose(); 
} 

但是這個必要嗎?如果外部using聲明處理innerDisposable以及outerDisposable,那麼它是多餘的。

那麼,如何處理這種一次性領域?

+3

不,'OuterDisposable.Dispose'方法必須照顧它,'using'只是確保'Dispose'被調用。 –

+0

包裝'IDisposable'類的'using'只調用'IDisposable'的Dispose'函數,它不檢查IDisposable屬性的對象屬性,所以你的假設是正確的 – bradbury9

+0

你可以很容易地檢查只要在inner的dispose方法中加入某種調試語句即可。 – Chris

回答

2

IDisposable是一個接口和一個模式。這不是C#語言的一部分,除了在usingforeach的明確支持。什麼都不會「自動」發生。

與此相反,如果這種處置確實發生了,那就自動考慮了。並且進一步考慮,對於一個類來說,舉一個共享某種可能是一次性的資源是完全有效的。你將不得不發明新的語法,然後才能「退出」你正在尋找的這種自動處置。

由於沒有這樣的功能,C#是一種更簡單的語言。當你,程序員知道他們不再被使用時,清理IDisposable對象總是你的責任。通常,對於像這樣的類,這將是當你自己調用Dispose方法時。

相關問題