Я слышал советы о том, как вводить коды для обработки неуправляемых ресурсов как в финализаторе, так и в методе Dispose(). То, что я не понимаю, состоит в том, что, поскольку финализаторы вызывается, когда происходит GC, мы можем технически предположить, что он все время называется. В таком случае зачем беспокоиться об удалении объекта? Я что-то упускаю?C# Почему у нас есть финализаторы
ответ
В таком случае зачем беспокоиться об удалении объекта?
Поскольку у вас нет контроля над , когда финализатор работает. Вполне возможно, что GC работает слишком часто, и программа, которая опирается только на финализаторы, может потерпеть крах из-за нехватки ресурсов (дескрипторы файлов, db-соединения).
Лучшая практика (одноразовый шаблон) использует финализаторы в качестве плана резервного копирования, нередко выполнение финализатора считается ошибкой, требующей исправления.
или * если * финализатор работает. Кто-то связывает сообщение в блоге, о котором я думаю :) – Rotem
Там http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx – Rotem
Да, правильно, это угловой случай , но он показывает, как мало мы можем полагаться на финализаторы для реализации логики выпуска ресурсов. – Rotem
Цитируя MSDN http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx
Хотя финализаторы эффективны в некоторых сценариях очистки, они имеют два существенных недостатка:
Финализатор вызывается, когда GC обнаруживает, что объект имеет право на сбор. Это происходит на неопределенный период времени после того, как ресурс не нужен . Задержка между тем, когда разработчик мог или захотел выслать ресурс, и время, когда ресурс на самом деле , выпущенный финализатором, может быть неприемлемым в программах, которые приобретают много ограниченных ресурсов (ресурсы, которые можно легко истощать) или в случаи, когда ресурсы являются дорогостоящими для использования (например, большие неуправляемые буферы памяти).
Когда CLR нужно вызвать финализации, он должен отложить сбор памяти объекта до следующего раунда сбора мусора (в Финализаторах курсируют между коллекциями). Это означает, что память объекта (и все объекты, на которые он ссылается) не будет освобождена для более длительного периода времени.
- 1. Почему у нас есть argv [2] [0]
- 2. У нас есть MultiBiMap?
- 3. Почему у нас есть закрытие в JavaScript?
- 4. Почему у нас есть Function.call в javascript?
- 5. Почему у нас есть нестатические функции/методы?
- 6. Почему у нас есть две версии Java?
- 7. Почему у нас есть правила пользователя?
- 8. Почему у нас есть Redis, когда у нас есть временные таблицы MySQL?
- 9. Проверка, есть ли у нас константный тип
- 10. Почему у нас медленный `malloc`?
- 11. Почему у нас есть неиспользуемые функции, но у нас нет неиспользуемых переменных?
- 12. Почему у нас есть «EventMaskType» дважды в последней строке?
- 13. Почему у нас есть указатели, отличные от void
- 14. Почему у нас есть проблема с текущей меткой?
- 15. У нас есть функция сортировки в .net
- 16. Есть ли у нас автопрокат в Perl?
- 17. Почему важно узнать о массивах, когда у нас есть ArrayLists?
- 18. Почему equals() метод, когда у нас есть оператор?
- 19. Почему StringJoiner, когда у нас уже есть StringBuilder?
- 20. Почему у нас есть дополнительный массив ведер в алгоритме хеширования?
- 21. Почему у нас есть суффикс после числа в этом случае?
- 22. Почему у нас есть выход: S1S2 в этом случае?
- 23. Почему у нас есть зоны памяти в Linux?
- 24. Почему мы используем процесс, когда у нас есть потоки?
- 25. Почему у нас есть вызываемые объекты в python?
- 26. Почему ViewData используется, когда у нас есть ViewBag?
- 27. Почему интерфейсы в Java, если у нас есть абстрактный класс?
- 28. Что означает R0902 Пилинта? Почему у нас есть этот предел?
- 29. Если siftDown лучше, чем siftUp, почему у нас это есть?
- 30. Почему у нас есть функции «не число» (isNan)?
Почему этот вопрос получил downvoted? Если это не дубликат, это действительно хороший вопрос. –
Согласен @golergka, И почему закрываются как слишком широкие? Хенку удалось суммировать ответ в одном предложении. Некоторые люди слишком счастливы. – Liam
@golergka, пожалуйста, объясните, почему это «действительно хороший вопрос»? Учитывая популярность .NET, этот вопрос должен быть задан раньше (и это было, следовательно, я закрыл голосование с дубликатом). Он не показывает никаких исследований или понимания предмета. – CodeCaster