Итак, краткий ответ: да, вы можете использовать простую форму
public void Dispose() => _children.ForEach(item => item.Dispose());
в вашем случае.
Расширенная форма
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
...
}
}
, которая является базовой реализацией базовый шаблон удаления , здесь немного избыточна, но предлагается в качестве хорошего способа и основы для будущих возможных расширенийкласс посредством наследования (если он не запечатан).
Более длинный ответ подразумевает прояснение возможных сценариев, связанных с удалением, и лучших практик для этого.Процесс уничтожения объекта имеет дело с двумя типами ресурсов, управляемых и управляемых.Управляемые ресурсы могут быть успешно обработаны GC, поэтому нам, как правило, не стоит слишком сильно беспокоиться об этом, в то время как освобождение неуправляемых ресурсов является обязанностью вызова кода, поскольку GC не может отслеживать их распределение и перераспределение.IDisposable
Цель интерфейса - рассмотреть сценарии, когда неуправляемое выделение ресурсов должно обрабатываться в некотором объекте или иерархии объектов.Теперь что касается возможных случаев:
- , если ваш класс напрямую сохраняет неуправляемые ресурсы, рекомендуется использовать расширенный финализируемый шаблон удаления с финализатором, чтобы покрыть случаи неправильного использования классавнешними потребителями или в исключительных ситуациях, чтобы получить гарантированное перераспределение ресурсов с помощью
Dispose
или финализатора; - , если ваш класс содержит другие
IDisposable
, но не содержит неуправляемые ресурсы напрямую, рекомендуемый способ:используя базовый шаблон удаления без финализатора;
Пара замечаний о разделении ответственности за уничтожение, как это выглядело в комментариях.Каждый класс должен отвечать за четкую обработку релиза только для тех ресурсов, которые он непосредственно сохраняет.Он не должен беспокоиться о том, чтобы пытаться обрабатывать сценарии выпуска базовых объектов каким-либо иным способом, кроме как с помощью своих публично представленных контрактов, то есть через IDisposable
или любым другим интерфейсом, и не должен делать никаких предположений помимо этих публичных контрактов.