2013-06-13 3 views
3

Когда производный класс переопределяет 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, но больше разъяснений от опыта народов.

ответ

4

«Это зависит»

Вы не можете иметь твердое правило для этого, потому что заказ вам нужно позвонить распоряжаться, будет зависеть от реализации классов.

Иногда вам может понадобиться это с самого начала, иногда в конце, а иногда и посередине. В большинстве случаев это, вероятно, не имеет значения.

Вообще говоря, люди, кажется, называют это первым (при отсутствии каких-либо других причин назвать его в другое время).

Одна из причин склонить себя к вызову в первую очередь заключается в том, что тогда производный класс имеет возможность делать специальные вещи после этого, если это необходимо.

+0

Это было мое мнение было хорошо ... – AwkwardCoder

+1

«Одна из причин склониться к его вызову в первую очередь заключается в том, что тогда производный класс имеет возможность делать специальные вещи после этого, если это необходимо »- правда, но тем не менее одной из причин назвать это последним является то, что тогда производный класс имеет шанс сделать специальный материал заранее :) – Joe

1

Вы должны думать о последствиях различных подходов. В большинстве случаев объекты IDisposable, принадлежащие базовому классу, будут независимы от объектов, принадлежащих производному классу, и порядок распоряжения не имеет значения, если ни один из методов Dispose не выбрасывает исключение (*).

Если критически важно освободить ресурс IDisposable, вы можете рассмотреть возможность использования try/finally для обеспечения всех методов Dispose, но это не универсально. Например, класс System.Component.Container управляет и удаляет несколько объектов IDisposable, но не пытается обеспечить, чтобы все они были удалены, если выбрано исключение.

(*) Совершенно легально для Dispose, чтобы бросить: например, FileStream может попытаться сбросить данные на сетевой ресурс, который больше не доступен в течение Dispose.

0

Утилизируйте объект в обратном порядке для создания. Итак, во-первых, создается базовый класс, поэтому он должен быть удален в конце и так далее ...

Смежные вопросы