Использование деструктора / Dispose базового класса?

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

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

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

4 ответов


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


вы должны следовать одноразовые шаблон здесь. Он также обслуживает наследование.

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

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

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

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


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

protected void Dispose(bool disposing)

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

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