Использование деструктора / Dispose базового класса?
В C#, как указано в документация и это хороший постпринятый ответ, указано, что классы не наследуют деструктор своего родительского класса.
вопрос : Если я хочу убедиться, что располагаю частными элементами базового класса, это правильный способ реализовать IDisposable во всем дочернем классе и в методе Dispose вызвать base.Dispose ()?
Это выглядит нормально, но я бы предпочли способ, который не требовал бы реализации во всех дочерних классах.
4 ответов
вы должны следовать одноразовые шаблон здесь. Он также обслуживает наследование.
интересная часть здесь- "деструкторы не наследуют", я не уверен, что делать с этим. Я написал небольшой тест, но, к моему облегчению, вам нужно только написать деструктор в базовом классе.
поэтому дети отцепили от базового класса неуправляемые ресурсы. Они могут переопределить 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) в тот, который будет, в случайных случаях, пытаться очистить ресурсы, которые все еще используются (не часто вызывают проблемы, но могут вызвать редкие, но немедленные сбои).