Хорошие примеры использования Финализаторов в C # - PullRequest
9 голосов
/ 03 ноября 2010

Когда я прочитал несколько статей об управлении памятью в C #, я был сбит с толку методами Finalizer.

Есть так много сложных правил, которые связаны с ними.Например, никто не знает, когда будут вызываться финализаторы, они вызываются, даже если код в ctor создает, CLR не гарантирует, что все финализаторы будут вызваны, когда программы закрываются и т. Д.

Для каких финализаторов можно использовать вреальная жизнь?

Единственный пример, который я нашел, это программа, которая издает звуковые сигналы при запуске GC.

Используете ли вы Finalizer в вашем коде и можете иметь несколько хороших примеров?

UPD:

Финализаторы могут использоваться, когда разработчики хотят убедиться, что некоторые классы всегда располагаются правильно через IDisposable.( ссылка ; Спасибо Стив Таунсенд )

Ответы [ 2 ]

4 голосов
/ 03 ноября 2010

Существует исчерпывающее обсуждение использования финализатора, с примерами, здесь .Ссылка любезно предоставлена ​​@SLaks на связанный ответ.

См. Также здесь для более краткого описания того, когда он вам нужен (что «не очень часто»),

Хороший предварительный ответ здесь с еще одним хорошим примером из реального мира.

Подведем итог с соответствующей выдержкой:

Финализаторынеобходим для гарантии высвобождения дефицитных ресурсов обратно в операционную систему, таких как файловые дескрипторы, сокеты, объекты ядра и т. д.

Для получения более правильных реальных примеров просмотрите уязвимые местаклассы в .Net Framework этот поиск MSDN:

http://social.msdn.microsoft.com/Search/en-US?query=%22.Finalize%22&ac=8

Одна веская причина, по которой я могу подумать, когда вам может понадобиться использовать финализатор, - это если вы переносите сторонний собственный кодAPI в управляемой оболочке и базовая библиотека API с собственным кодом требует своевременного освобождения используемых ресурсов операционной системы.

3 голосов
/ 03 ноября 2010

Лучшая практика, известная мне, проста - не используйте их. Тем не менее, могут быть некоторые случаи, когда вы хотите использовать финализатор, особенно когда имеете дело с неуправляемыми объектами, и вы не можете реализовать шаблон Dispose (я не знаю устаревших проблем), тогда вы можете реализовать метод Finalize с осторожностью (и это может снизить производительность вашей системы, сделать ваши объекты нежитью и другими, возможно, странными сценариями, учитывая исключения, поскольку они не поддаются обнаружению:)).

В 99% случаев просто напишите шаблон использования Dispose и используйте этот метод для очистки после себя, и все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...