簡體   English   中英

基類的處理順序

[英]Order of disposal for base classes

當派生類重寫Dispose時,應該先派生基類Dipose,然后派生類處置任何本地資源嗎?

我之所以這樣問,是因為我們的團隊中的每個人都對每種情況都說是的,我正在嘗試確定這是個好主意還是只是“貨迷”編程,我都沒有強烈的看法。

之前:

 public override void Dispose()
 {
     base.Dispose();

     if (!_isDisposed)
     {
         _isDisposed = true;

         if (_foo != null)
         {
             _foo.Dispose();
         }
     }
 }

后:

 public override void Dispose()
 {
     if (!_isDisposed)
     {
         _isDisposed = true;

         if (_foo != null)
         {
             _foo.Dispose();
         }
     }

     base.Dispose();
 }

注意:我不是在尋找如何實現基本處置模式,而是從人們的經驗中獲得更多的說明。

“這取決於”

您不能為此制定嚴格的規則,因為您需要調用dispose的順序取決於類的實現。

有時您可能希望一開始就使用它,有時要在結尾處使用,有時在中間。 大多數時候,這可能無關緊要。

一般而言,人們似乎先調用它(沒有其他原因在不同時間調用它)。

傾向於首先調用它的一個原因是,如果需要,派生類隨后有機會進行特殊處理。

您應該考慮不同方法的后果。 在大多數情況下,基類擁有的IDisposable對象將獨立於派生類擁有的IDisposable對象,並且只要Dispose方法均未引發Exception(*),則Dispose的順序將無關緊要。

如果釋放IDisposable資源至關重要,則可以考慮使用try / finally來確保調用所有Dispose方法-但這並不是普遍的做法。 例如, System.Component.Container類管理和處置多個IDisposable對象,但如果拋出異常,則不嘗試確保將其全部處置。

(*) Dispose拋出是完全合法的:例如, FileStream可能會嘗試將數據刷新到Dispose期間不再可用的網絡資源。

以相反的順序放置對象以進行創建。 因此,首先創建基類,然后將其放置在最后,依此類推...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM