Использование деструктора / избавиться от базового класса? - PullRequest
9 голосов
/ 20 апреля 2011

В C #, как упомянуто в Документации , и принятом ответе этого милого поста , указано, что классы не наследуют Destructor своего родительского класса.

Вопрос : Если я хочу убедиться, что располагаем приватными элементами базового класса, это правильный способ реализации IDisposable во всех дочерних классах, а в методе Dispose вызовите base.Dispose ()?

Это выглядит нормально, но я бы предпочел способ, который не требовал бы реализации во всех дочерних классах.

Ответы [ 4 ]

15 голосов
/ 20 апреля 2011

MSDN утверждает, что деструкторы вызываются в базовые классы автоматически.

6 голосов
/ 20 апреля 2011

Вы должны следовать шаблону Disposable здесь. Это также обслуживает наследство.

Интересная часть здесь "деструкторы не наследуют", я не уверен, что с этим делать. Я написал небольшой тест, но, к моему облегчению, вам нужно написать деструктор только в базовом классе.

Таким образом, дети отсоединяются от неуправляемых ресурсов базового класса. Они могут переопределить Dispose(bool) для очистки своих собственных дел.

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

С точки зрения общего дизайна, одноразовый класс лучше запечатать.

0 голосов
/ 20 апреля 2011

Если родительский класс использует шаблон Microsoft IDisposable, дочерний класс не должен переопределять Dispose (void), а должен переопределять Dispose (Boolean Disposing).Если вызывается с Disposing true, он должен удалить дочерний класс и вызвать base.Dispose (True).Если вызывается с Disposing false, в большинстве случаев он не должен ничего делать, кроме вызова base.Dispose (False).

Обратите внимание, что в большинстве случаев вызов base.Dispose (False) ничего не делает, но долженбыть сделано в любом случае.Если дочернему классу нужно будет добавить дополнительные «неуправляемые ресурсы» (т. Е. Если у него есть дополнительные обязанности, которые необходимо выполнить в финализаторе), он, как правило, должен инкапсулировать эти обязанности в другом объекте.Обратите внимание, что вопрос о том, имеет ли класс финализатор, - это не просто «деталь реализации»;добавление финализатора к базовому классу может привести к серьезным изменениям, приводящим к тому, что программа, которая утекла бы ресурсы (плохие, но, возможно, выжившие, если программа не запускается слишком долго за раз), в случайный случай.попытаться очистить ресурсы, которые все еще используются (не часто вызывают проблемы, но могут вызывать редкие, но немедленные сбои).

0 голосов
/ 20 апреля 2011

Базовый класс должен использовать стандартный шаблон IDisposable для базовых классов - таким образом, только базовый класс нуждается в финализаторе, а производные классы просто переопределяют виртуальный метод

protected void Dispose(bool disposing)
...