Вопрос 1:
В зависимости от типов объектов, которые вы перечисляете (например, База данных, Веб-браузер, Растровое изображение и т. Д.), Это только 1003 * управляемые ресурсы в отношении .NET. Таким образом, вы должны реализовать IDisposable
для любого класса, который имеет одноразовые типы в качестве членов. Если они являются локально объявленными экземплярами, вы просто вызываете 'using ()' для них. Хотя в этих случаях, о которых вы упоминаете, есть неуправляемые ресурсы, но они отвлекаются от вас .NET через используемые вами типы. Поскольку вы используете только управляемые типы, вы должны реализовать IDisposable
, но без финализатора . Вам нужно реализовать финализатор, только если у вас действительно неуправляемые ресурсы в качестве членов класса.
Вопрос 2:
Похоже, вы путаете наследование (is a) с агрегацией / сдерживанием (has a). Например, если «Контейнер» содержит одноразовый ресурс в качестве члена класса, он называется агрегацией / сдерживанием. Таким образом, вызов base.Dispose()
в реализации IDisposable
Контейнера не имеет ничего общего с удалением одноразового ресурса внутри Контейнера. Следует помнить, что если класс является производным от Container, скажем «DerivedContainer», то он является экземпляром контейнера, хотя и с дополнительными членами и / или функциональными возможностями. Таким образом, любой экземпляр DerivedContainer имеет все члены, которые имеет его базовый класс «Контейнер». Если вы никогда не вызывали base.Dispose()
, одноразовый ресурс в «Контейнере» не был бы освобожден должным образом (на самом деле это было бы GC, но по многим причинам плохая практика - просто «позволять .NET позаботиться об этом») - пожалуйста, обратитесь на мой ответ на Разве это плохая практика - зависеть от автоматического сборщика мусора .NET? .
Если бы вы не вызывали базовый класс Dispose()
, вы бы получили частично удаленный объект (расположенный в производном классе, но не в базовом классе) - очень плохой сценарий. Поэтому очень важно назвать базовый класс Dispose()
.
У меня есть шаблон наилучшей практики, который я разработал (с большим опытом и отладкой дампов памяти), написанный в моем блоге в качестве примера. В нем показано, как реализовать IDisposable
для базового класса, а также для производного класса:
http://dave -black.blogspot.com / 2011/03 / как-делать-вы-правильно-implement.html