Общее правило, когда следует реализовывать IDisposable - PullRequest
4 голосов
/ 14 июля 2009

РЕДАКТИРОВАТЬ: Этот вопрос является дубликатом В чем разница между управляемыми и собственными ресурсами при утилизации? (.NET) и многие другие. Пожалуйста, ответьте другим, если у вас есть что добавить.


В соответствии с Руководством по проектированию структуры *1009* Кшиштофа Квалины и Брэда Абрамса, тип, содержащий экземпляры одноразовых типов, должен реализовывать IDisposable.

Существуют ли еще какие-то общие практические правила, когда рекомендуется внедрять IDisposable?

Ответы [ 6 ]

12 голосов
/ 14 июля 2009

Реализуйте IDisposable, когда у вас есть класс, который оборачивает неуправляемый ресурс, или когда у вашего класса есть поле, которое реализует IDisposable.

4 голосов
/ 14 июля 2009

Когда вам нужно освободить неуправляемые ресурсы, внедрите IDisposable.

2 голосов
/ 14 июля 2009

Из MSDN: http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

Используйте метод Dispose этого интерфейса для явного освобождения неуправляемых ресурсов вместе с сборщиком мусора. Потребитель объекта может вызвать этот метод, когда объект больше не нужен.

1 голос
/ 21 марта 2011

IDisposable - одно из главных средств программирования для утечек памяти .Net. Хотя документация предполагает, что его следует использовать для внешних ресурсов, я широко использую IDisposable для освобождения внутренних ресурсов, таких как указатели на родительские классы.

Довольно легко продемонстрировать требование, создав два взаимно-ссылочных класса, то есть foo и bar. foo относится к бару и наоборот. Когда foo выходит из области видимости, GC видит, что bar все еще ссылается на нее, поэтому она не собирается (и наоборот). Память не собирается.

Это тот же стиль проблемы, который проявляется в EventHandlers, когда ссылка не освобождается, когда форма закрыта, если она явно не освобождена или не реализована модель WeakEvent.

Я бы предположил, что наилучшей практикой является использование модели программирования C ++, в которой вы очищаете после себя, используя Dispose , если только вы не уверены, что GC может решить эту проблему за вас.

1 голос
/ 14 июля 2009

Обычно я использую IDisposable каждый раз, когда мне нужно выполнить очистку элементов. Для меня это когда пишу код, который абстрагирует базу данных / сеть / файловые системы.

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

1 голос
/ 14 июля 2009

Всякий раз, когда вы выделяете ресурсы, которые должны быть освобождены, такие как файлы, дескрипторы и т. Д. Например, если вы используете ресурсы Win32 (которые не реализуют IDisposable), вы должны реализовать IDisposable для их освобождения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...