2009-07-03 24 views
5

我目前正在修復一個沒有Dispose使用模式的c#代碼庫。在一個IDisposable模式中,基類應該允許派生類共享其處理的標誌嗎?

這是一個大的代碼庫,這是一個需要資源的代碼庫,並在低級別使用了很多定製託管C++庫。

我對配置模式有很好的理解。我花了一些時間瞭解什麼,我認爲是在這個問題上的黃金標準的文章:Joe Duffy's dispose article

在試圖儘量減少重複代碼,我們一直在考慮一些處置輔助類,所以我的問題:

如果一個基類實現了一個標準的Dispose模式,它應該允許它的處理標誌被共享,即。標記爲受保護的?

澄清我的意思是應該只有一個繼承heirarchy中只有一個布爾狀態,定義一個對象實例是否已被處置或應該有一個私人布爾在繼承階梯的每一步?

在MSDN,並在上面的鏈接的例子在每個級別設置一個標誌,但從來沒有解釋它背後的原因。我對這個問題有兩個想法,你有什麼想法和理由?

回答

5

我會說不,它不應該共享國旗。共享該標誌創造了更好的封裝可以防止的失敗機會。

例如,考慮您在基本大多數類上具有隻讀屬性的場景。僅在基類的Dispose(disposing)方法中將後臺字段設置爲true。這意味着Disposed屬性只有在調用基類Dispose時纔會返回true(當然,除了邪惡的反射)。這允許基類提供可執行的合同。

現在考慮相反的情況,那裏有一個受保護的setter。現在任何類都可以任意設置Disposed屬性爲true而不處置任何東西。這爲Dispose在無處理時返回true提供了機會。

我會選擇第一個選項,因爲它提供了最強制執行的合同。

0

我建議在基類上使用public getter和protected setter來設置Disposed屬性。

+0

謝謝 - 但要澄清你爲什麼贊成在每個級別的私人財產單一受保護的財產? – morechilli 2009-07-03 15:09:34

0

在你有應該做的事情上課的時候已經佈置不同,比如拋出異常的方法的情況下,我想創建的基礎類,其讀取基類中的私有字段被保護的唯一吸氣劑性能。這樣你就可以讓任何繼承者知道他是否能夠執行操作。

然後,如果一個類已經被安置到它自己的Dispose方法知道(例如:避免釋放資源的兩倍),我認爲有一個專用標誌是清晰和維護好。

0

除了JaredPar的答案,我想補充一點,並不總是需要有是一個_disposed標誌。很多時候,對象的其他「資源相關」字段自然會提供一種表示處置狀態的方式。

例如,需要被Shutdown之前被丟棄將由到COM對象的引用來表示的。因此,Dispose相關部分將是外部COM對象:

if (_comObject != null) 
{ 
    _comObject.Shutdown(); 
    _comObject = null; 
} 

這可以根據需要多次安全地運行多次,而不必多次調用Shutdown。試圖在Dispose之後嘗試使用_comObject的其他方法將獲得NullReferenceException,或理想情況下這些方法將檢查_comObject字段並拋出ObjectDisposedException

我覺得這通常比沒有 - 經常使用IDisposable,我不記得需要一個單獨的_disposed字段。介紹一個會增加自由度(增加我把它搞砸的方法的數量)。

因此,即使這是一個安全的想法(它不是,正如JaredPar所解釋的),這對派生類來說不太可能是有用的。

相關問題