2012-04-20 2 views
2

Нужно ли утилизировать пользовательские объекты, даже если они содержат только управляемые объекты? Например, у меня есть пользовательский класс, который содержит некоторые объекты List, а также некоторые типы строк и xmldocument. Должен ли я создать свой собственный метод Dispose (пока не наследовать от IDisposable) и просто очистить их, чтобы убедиться, что они пусты? Если я должен, должен ли я также наследовать от IDisposable?Утилизация пользовательских объектов

+0

«Необходимое» - сильное слово. Если они большие и громоздкие или могут использовать значительные ограниченные ресурсы, рекомендуется реализовать IDisposable для освобождения этих ресурсов. –

+0

Ответ на часто задаваемый вопрос подробно описан в общем использовании IDisposabe и стоит прочитать [Правильное использование интерфейса IDisposable] (http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface). –

+0

@JeremyHolovacs - «большой» здесь не уместен, речь идет не о памяти. Только о (управляемых) ресурсах. –

ответ

6

Только если один или несколько из этих управляемых объектов наследуются от IDisposable.

Если у вас есть IDisposable objects (aka managed resources), тогда реализуйте IDisposable, но do не добавьте деструктор/финализатор.

+0

И, если это так, также реализуйте IDisposable в пользовательском классе. – phoog

+0

@HenkHolterman деструктор/финализатор, это метод [MyCustomClassName]? – ganders

+0

@ ganders - Да. –

2

Как правило, вы должны реализовать IDisposable, если какой-либо из экземпляров управляемого объекта вы ссылаетесь на реализацию IDisposable. Затем вы можете использовать их в своей реализации Dispose.

0

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

Другая история, конечно, когда некоторые из ваших объектов, содержащихся в вашем объекте, требуют явного удаления, то есть реализует IDisposable или требует закрытия в конце срока службы (хотя правильный способ был бы в любом случае реализовать IDisposable), и т. д. Таким образом, вам, возможно, потребуется реализовать IDisposable самостоятельно и утилизировать содержащиеся в нем объекты в Dispose.

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

Смежные вопросы