Все ответы, написанные до сих пор, упускают ключевой момент: необходимо, чтобы базовый тип или базовый интерфейс реализовали IDisposable
, если вполне вероятно, что код, который ожидает экземпляр базового класса, мог бы иначе приобрести владение экземпляра, который требует избавления, не осознавая этого. Наиболее распространенный сценарий, с помощью которого это может происходить, - это метод фабрики; ярким примером является IEnumerable<T>
/ IEnumerator<T>
. Большинство перечислителей не требуют очистки, но код, вызывающий IEnumerable<T>.GetEnumerator
, как правило, не имеет конкретной причины полагать, что возвращенный перечислитель действительно потребует очистки, или полагать, что это не так. Как правило, все реализации IEnumerator<T>
реализуют IDisposable
и все потребители вызывают Dispose
в возвращенном перечислителе, чем когда потребители проверяют, реализует ли возвращаемый тип IDisposable
, и вызывают его, если так.
Если ожидается, что ссылки базового типа, как правило, будут использоваться только методами, которые не будут отвечать за очистку рассматриваемых элементов, нет необходимости в базовом типе для реализации IDisposable
. Код, который будет отвечать за очистку, будет знать, что объекты, с которыми он имеет дело, реализуют IDisposable
независимо от того, делает это базовый тип.