2013-11-11 5 views
3

Я слышал советы о том, как вводить коды для обработки неуправляемых ресурсов как в финализаторе, так и в методе Dispose(). То, что я не понимаю, состоит в том, что, поскольку финализаторы вызывается, когда происходит GC, мы можем технически предположить, что он все время называется. В таком случае зачем беспокоиться об удалении объекта? Я что-то упускаю?C# Почему у нас есть финализаторы

+4

Почему этот вопрос получил downvoted? Если это не дубликат, это действительно хороший вопрос. –

+1

Согласен @golergka, И почему закрываются как слишком широкие? Хенку удалось суммировать ответ в одном предложении. Некоторые люди слишком счастливы. – Liam

+3

@golergka, пожалуйста, объясните, почему это «действительно хороший вопрос»? Учитывая популярность .NET, этот вопрос должен быть задан раньше (и это было, следовательно, я закрыл голосование с дубликатом). Он не показывает никаких исследований или понимания предмета. – CodeCaster

ответ

10

В таком случае зачем беспокоиться об удалении объекта?

Поскольку у вас нет контроля над , когда финализатор работает. Вполне возможно, что GC работает слишком часто, и программа, которая опирается только на финализаторы, может потерпеть крах из-за нехватки ресурсов (дескрипторы файлов, db-соединения).

Лучшая практика (одноразовый шаблон) использует финализаторы в качестве плана резервного копирования, нередко выполнение финализатора считается ошибкой, требующей исправления.

+0

или * если * финализатор работает. Кто-то связывает сообщение в блоге, о котором я думаю :) – Rotem

+1

Там http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx – Rotem

+0

Да, правильно, это угловой случай , но он показывает, как мало мы можем полагаться на финализаторы для реализации логики выпуска ресурсов. – Rotem

2

Цитируя MSDN http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx

Хотя финализаторы эффективны в некоторых сценариях очистки, они имеют два существенных недостатка:

  • Финализатор вызывается, когда GC обнаруживает, что объект имеет право на сбор. Это происходит на неопределенный период времени после того, как ресурс не нужен . Задержка между тем, когда разработчик мог или захотел выслать ресурс, и время, когда ресурс на самом деле , выпущенный финализатором, может быть неприемлемым в программах, которые приобретают много ограниченных ресурсов (ресурсы, которые можно легко истощать) или в случаи, когда ресурсы являются дорогостоящими для использования (например, большие неуправляемые буферы памяти).

  • Когда CLR нужно вызвать финализации, он должен отложить сбор памяти объекта до следующего раунда сбора мусора (в Финализаторах курсируют между коллекциями). Это означает, что память объекта (и все объекты, на которые он ссылается) не будет освобождена для более длительного периода времени.

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