Class ComponentsContainer ' a component contains other components'
Inherits System.ComponentModel.Component
Private foo as New Component
Private bar as New Component
Protected Override Sub Finalize()
foo.Dispose() ' HERE ? '
bar.Dispose()
MyBase.Finalize()
End Sub
Protected Overrides Sub Dispose(disposing As Boolean)
If disposing Then
foo.Dispose() ' OR HERE ? '
bar.Dispose()
End If
MyBase.Dispose(disposing)
End Sub
End Class
ответ
Вы не должны (не обязательно) Dispose управляемые ресурсы из Finalizer:
Protected Override Sub Finalize()
' foo.Dispose() '
' bar.Dispose() '
MyBase.Finalize()
End Sub
И из этого следует, что если ваш класс не имеет неуправляемых ресурсы вам не нужны Finalizer.
Примечание: в вашем классе отсутствует перегрузка
Public Sub Dispose()
.
Edit:
С foo
и bar
управляются ресурсы (простирающиеся компонент) требуется только метод Protected Overrides Sub Dispose(disposing As Boolean)
. Версия в вопросе верна. И просто снимите Finalize()
.
Финализатор должен вызывать этот класс 'Dispose передать false для параметра размещения, а не прямо распоряжаться объектами, которыми владеет этот класс. См. MSDN.
Редактировать: Чтобы ответить на вопрос, удаление принадлежащих им объектов должно быть выполнено в Dispose, а не в Finalize.
Edit 2: Обратите внимание, это означает, что если объект будет завершен без утилизировать, то Dispose только дозвонился (по Finalize) «ложным» параметр, и дочерние объекты не будут захоронены этим класс. Это правильно, потому что они являются управляемыми объектами и будут завершены, когда среда будет выглядеть так, как если бы она не была явно удалена.
Исправить. И в этом примере Dispose (False) ничего не делает (кроме, может быть, в базовом классе). Лучшим вариантом было бы удаление как Finalize, так и Dispose (bool). –
Итак, наконец, где я должен распоряжаться foo и bar? – serhio
В методе Dispose. – BlueMonkMN
Dispose
- это когда вы явно хотите освободить некоторые ресурсы, прежде чем сборщик мусора освободит объект.
Finalize
автоматически вызывается, когда сборщик мусора обходит вокруг, чтобы освободить объект.
Если у вас есть много объектов, которые держатся за ресурсы, тогда, поскольку вы не должны контролировать сбор мусора, вы должны использовать Dispose.
Из документации рамочной:
Обратите внимание, что даже если вы предоставите явное управление посредством Dispose, вы должны обеспечить неявную очистку с использованием метода Finalize. Финализация обеспечивает резервную копию, чтобы предотвратить утечку ресурсов из-за постоянного утечки, если программист не может вызвать Dispose.
Implementing Finalize and Dispose to Clean Up Unmanaged Resources
Итак, явная очистка в моем случае должна быть 'foo.Dispose' и' bar.Dispose', теперь что может означать «неявная очистка» в Finalize в моем случае, я не вижу ... – serhio
Что вы наследующий? Я подозреваю, что это может быть System.ComponentModel.Container, прямо или косвенно.
В этом случае вам ничего не нужно делать. System.ComponentModel.Container automatically содержит любые компоненты, которые он содержит, в своем методе Dispose
. Оставьте это в покое - это должен быть самый простой способ реализовать шаблон dispose/finalize.
Наследование от 'System.ComponentModel . Компонент'. Обновлен код. – serhio
Почему бы не наследовать от Контейнера? Вот для чего это. – MarkJ
В реальном проекте я использую VisualBasic.PowerPacks.Shape (это компонент). Итак, у меня есть настраиваемая (многострочная) форма, содержащая некоторые внутренние фигуры (линии). – serhio
- 1. Завершение или удаление сеанса Asp.net
- 2. Как реализовать Завершение задачи
- 3. Удаление FrameworkElements на завершение анимации
- 4. Как реализовать одноэтапное завершение табуляции?
- 5. Как реализовать завершение работы с использованием кода
- 6. Как реализовать рекурсивное удаление?
- 7. прерывание, завершение или выход?
- 8. как реализовать завершение имени файла в Emacs
- 9. как реализовать код завершение в квартах
- 10. Как реализовать гарантированное завершение поведения объекта
- 11. Удаление None и завершение в python?
- 12. Как реализовать удаление Intermediate таблицы
- 13. Emacs завершение: автозаполнение или компания?
- 14. removeItemAtPath завершение
- 15. Как реализовать отменное удаление с помощью CRUD?
- 16. Как реализовать мягкое удаление в DataGridView
- 17. Возможно ли реализовать надежный приемник, который поддерживает негибкое завершение работы?
- 18. Как реализовать каскадное удаление в Objectify?
- 19. Завершение разговора
- 20. Завершение объекта COM
- 21. Переключатель LongPressHold, не оценивающий завершение/сбой (удаление и падение)
- 22. Как реализовать автоматическое завершение в Smartface App Studio
- 23. Возможно ли реализовать завершение кода Python в TextMate?
- 24. Vimscript: Как я могу реализовать автоматическое завершение аргумента метода?
- 25. Как правильно реализовать мягкое удаление в postgresql?
- 26. Как реализовать «Удаление загруженных файлов» Carrierwave?
- 27. Как реализовать пользовательское удаление в Django?
- 28. Как реализовать добавление и удаление хэштегов
- 29. Как реализовать удаление для строки для backgrid
- 30. Как реализовать мягкое удаление на cgridview?
Подозреваемый перегрузка 'Public Sub Dispose' происходит из базового класса – MarkJ
Я обновил код, объясняющий, откуда я наследую. У меня есть компонент, который содержит 2 других компонента. – serhio
@MarkJ, вы правы, и serhio сделал это уверенным. –