2009-08-31 6 views
5

Если я реализую объект с IDisposable, должны ли все объекты, которые владеют этим объектом, реализовать его, даже если у них нет других ресурсов для выпуска?IDisposable chain

ответ

12

Да. Вы должны избавиться от них, чтобы ваши переменные-члены были правильно настроены.

Каждый раз, когда вы инкапсулируете класс IDisposable, вы должны сделать свой класс IDisposable. В методе Dispose вы должны использовать свои инкапсулированные ресурсы. В принципе, относитесь к ним так же, как и к родному ресурсу.

+0

Только вы не можете установить порядок, в котором объекты будут удалены, если они вызваны потоком финализатора GC. –

+0

Правда, но я не уверен, насколько это актуально. Если вы завершаете свой класс и делаете его одноразовым, вы можете управлять порядком, в котором размещается каждый инкапсулированный ресурс. –

1

Если вы хотите детерминированное удаление, в конечном счете, какой-то клиент должен вызвать Dispose или обернуть вызовы в блоке «using». Чтобы просочиться к вашему объекту, это может потребовать, чтобы владелец также реализовал IDisposable.

Вы не должны полагаться на сборщик мусора, чтобы освобождать ресурсы, зависящие от времени.

+0

Это не проблема неуправляемых ресурсов. Объекты, которые владеют неуправляемым ресурсом, будут: 1) использовать 'SafeHandle' или 2) использовать пользовательский финализатор для освобождения неуправляемых ресурсов. Хотя это не является детерминированным, сборщик мусора * способен правильно освобождать неуправляемые ресурсы. Основным преимуществом правильных цепочек «IDisposable» является своевременное «закрытие», «конец» или «выпуск» ресурсов, чувствительных к проблеме, таких как (но определенно не ограничиваясь) ввода-вывода. –

+0

Отмечено. Благодарю. –

1

Да, владеющий класс должен реализовывать IDisposable, но он не нуждается (не должен иметь) Finalizer (деструктор).

1

NOP, они просто должны использовать этот класс с «помощью» заявление, чтобы убедиться, что они располагают этот объект должным образом, но эти объекты сами по себе не должны реализовать IDisplosable

+0

Если другому классу принадлежит одноразовый объект, он должен также реализовать IDisposable. В противном случае у владеющего класса нет возможности разрешить вызывающим абонентам распоряжаться им и, следовательно, располагаемым ресурсам, которыми он владеет внутри страны. –

+0

это зависит только от того, как класс использует объект внутри. – BlackTigerX

+0

Я использую слово «собственный» специально для обозначения «имеет переменную-член указанного типа», так что это не работает. Я использую работу «использует» для того, о чем вы говорите. –