Штраф за исполнение для финализатора, если он никогда не вызывался - PullRequest
4 голосов
/ 03 февраля 2011

У меня есть класс с финализатором. Но так как я всегда вызываю Dispose(), а Dispose() вызывает GC.SupressFinalize(this), я думаю, что мой объект никогда не попадает в очередь на финализацию. Финализатор просто используется как задний ход на случай, если другой пользователь класса забудет позвонить Dispose().

Есть ли какое-то снижение производительности за простую реализацию финализатора, даже если он никогда не вызывался и объект никогда не попадает в очередь финализации?

Раньше я так не думал, но на странице 102 Effective C #: второе издание Билла Вагнера говорится: «Даже если его никогда не вызывать, присутствие финализатора действительно приводит к довольно высокой производительности штраф за ваши типы. "

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Есть ли какое-то снижение производительности за простую реализацию финализатора, даже если он никогда не вызывался и объект никогда не попадает в очередь финализации?

Пока вы правильно это реализуете и вызываете GC.SuppressFinalize для вашего объекта, "штраф" будет иметь место только тогда, когда пользователь не вызывает Dispose().

При этом «суровое» наказание на самом деле не так уж и строго в большинстве случаев. Это было бы проблемой, если бы у вас было много недолговечных объектов с финализаторами, загрязняющими процесс сборки мусора, но это редко проблема, так как объекты с финализаторами редки (в целом).

0 голосов
/ 03 февраля 2011

IIRC, проблема с финализаторами заключается в том, что объекты с ними выживают в течение дополнительного цикла gc. Однако это применимо только в том случае, если вызывается финализатор. Эта статья объясняет это хорошо: http://anasoft.wordpress.com/2007/06/17/more-about-gc-dispose-and-finalize/

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