Должны ли классы, которым передаются ссылки на объекты IDisposable, быть также IDisposable и устанавливать их в null при удалении? - PullRequest
2 голосов
/ 26 марта 2010

Я думаю, что вопрос говорит сам за себя.

Спасибо.

Ответы [ 6 ]

13 голосов
/ 26 марта 2010

Они должны реализовать IDisposable, если объект владеет этим ресурсом. Как правило, нет необходимости устанавливать нулевые значения, хотя это не причиняет вреда.

Если вы не владеете ресурсом, то, очевидно, вы не должны им распоряжаться, и вам не нужно внедрять IDisposable. По моему опыту, довольно редко у меня есть переменная-член для одноразового ресурса, который мне не принадлежит в моих классах, хотя ...

3 голосов
/ 26 марта 2010

«Держать ссылку» - не настоящий критерий. Когда объект логически «владеет» объектом IDiposable, тогда Yes, он должен реализовать IDisposable для вызова Dispose для всех принадлежащих ему объектов Disposable.
Но он не должен реализовывать деструктор (Финализатор).

1 голос
/ 26 марта 2010

Установка в нуль не обязательна, но вы должны вызвать .Dispose() для всех этих объектов из .Dispose().

родительского класса.

РЕДАКТИРОВАТЬ: ЕСЛИ И ТОЛЬКО ЕСЛИ ваш класс отвечал за создание этих объектов.

0 голосов
/ 26 марта 2010

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

Если ваш класс использует, но не создает одноразовые объекты, вам следует оставить очистку для создателя этих объектов.

0 голосов
/ 26 марта 2010

Да, они должны, если ссылка принадлежит классу, анализ кода FxCop / MS даже имеет проверку для него.

0 голосов
/ 26 марта 2010

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

...