Нужно ли утилизировать пользовательские объекты, даже если они содержат только управляемые объекты? Например, у меня есть пользовательский класс, который содержит некоторые объекты List, а также некоторые типы строк и xmldocument. Должен ли я создать свой собственный метод Dispose (пока не наследовать от IDisposable) и просто очистить их, чтобы убедиться, что они пусты? Если я должен, должен ли я также наследовать от IDisposable?Утилизация пользовательских объектов
ответ
Только если один или несколько из этих управляемых объектов наследуются от IDisposable.
Если у вас есть IDisposable objects (aka managed resources), тогда реализуйте IDisposable, но do не добавьте деструктор/финализатор.
Как правило, вы должны реализовать IDisposable
, если какой-либо из экземпляров управляемого объекта вы ссылаетесь на реализацию IDisposable
. Затем вы можете использовать их в своей реализации Dispose
.
Понимаете, установка ссылок на null
в конце срока действия вашего объекта ничего не изменит для сборщика мусора. Если единственные оставшиеся ссылки на содержащиеся объекты принадлежат вашему пользовательскому объекту, то сборщик мусора рассматривает их как подходящие для сбора мусора в любом случае (потому что он выглядит только для ссылок из живых объектов). Если есть ссылки из других источников, содержащиеся объекты не будут собираться, независимо от того, очищаете ли вы свои ссылки.
Другая история, конечно, когда некоторые из ваших объектов, содержащихся в вашем объекте, требуют явного удаления, то есть реализует IDisposable
или требует закрытия в конце срока службы (хотя правильный способ был бы в любом случае реализовать IDisposable
), и т. д. Таким образом, вам, возможно, потребуется реализовать IDisposable
самостоятельно и утилизировать содержащиеся в нем объекты в Dispose
.
Конечно, вам нужно реализовать IDisposable
особым образом, когда вы обратитесь к неуправляемых объектов, но это another story.
- 1. Утилизация объектов
- 2. Утилизация объектов в Destructor
- 3. AS3, утилизация объектов скворца
- 4. Утилизация объектов WCF
- 5. Утилизация объектов несколько раз
- 6. Правильная утилизация объектов SharePoint?
- 7. C# - Утилизация рекурсивных объектов
- 8. Утилизация отходов в пользовательских расширенных GridView?
- 9. Утилизация объектов перед потерей области (SqlCommand)
- 10. Утилизация объектов с длинными жизненными зависимостями
- 11. Утилизация объектов Notes с COM, утечки памяти
- 12. Чтение пользовательских объектов Значения объектов
- 13. Освобождение NSMutableArray пользовательских объектов
- 14. Массив пользовательских объектов - Swift
- 15. ArrayList пользовательских объектов
- 16. PFQuery текущих пользовательских объектов
- 17. Сортировка карты пользовательских объектов
- 18. Коллекция пользовательских объектов Сериализация
- 19. Выделение пользовательских имен объектов
- 20. Фильтр NSArray пользовательских объектов
- 21. Сортировка вектор пользовательских объектов
- 22. C# экземпляры пользовательских объектов
- 23. Doctrine: репозиторий пользовательских объектов
- 24. Способы печати пользовательских объектов
- 25. Доступные данные пользовательских объектов
- 26. Инициализаторы пользовательских объектов
- 27. Javascript пользовательских объектов функции
- 28. Сериализация пользовательских объектов
- 29. ios хранение пользовательских объектов
- 30. Сохранение NSArray пользовательских объектов
«Необходимое» - сильное слово. Если они большие и громоздкие или могут использовать значительные ограниченные ресурсы, рекомендуется реализовать IDisposable для освобождения этих ресурсов. –
Ответ на часто задаваемый вопрос подробно описан в общем использовании IDisposabe и стоит прочитать [Правильное использование интерфейса IDisposable] (http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface). –
@JeremyHolovacs - «большой» здесь не уместен, речь идет не о памяти. Только о (управляемых) ресурсах. –