Почему «метод Finalize не должен ссылаться ни на какие другие объекты»? - PullRequest
7 голосов
/ 22 апреля 2010

Я размышлял, почему рекомендуется , а не освободить управляемые ресурсы внутри finalize. Если вы видите пример кода на http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx и ищете строку «Dispose (bool dispose) выполняется в двух разных сценариях» и читаете этот комментарий, вы поймете, что я имею в виду.

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

спасибо, Мишала

Ответы [ 2 ]

11 голосов
/ 22 апреля 2010

Если вы ссылаетесь на другой объект из финализатора, вы не знаете, если , что объект уже завершен - и как он будет себя вести, если будет завершен. (Я не знаю, выполняет ли какой-либо текущий CLR несколько потоков финализатора, но другая страшная возможность заключается в том, что он находится в процессе финализации при запуске финализатора.)

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

2 голосов
/ 22 апреля 2010

Я думаю, вы в значительной степени ударили ноготь по голове. Если вы посмотрите на формулировку в документации Object.Finalize , там написано: See the IDisposable interface for a complementary and more controllable means of disposing resources. «Дополнительный», означающий «еще один способ сделать это» и контролируемое существо… именно то, что вы сказали.

Редактировать: И что сказал Джон Скит. Понятие о нескольких потоках финализатора гарантировало, что я либо не буду спать, либо буду иметь очень плохие сны сегодня вечером.

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