То, почему “Завершают метод, не должно ссылаться ни на какие другие объекты”?

Я обдумывал, почему рекомендуется, чтобы мы не высвобождали управляемые средства, внутри завершают. Если Вы видите пример кода по http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx и ищете строку, "Располагают (bool располагающий), выполняется в двух отличных сценариях", и прочитайте тот комментарий, Вы поймете то, что я имею в виду.

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

спасибо, mishal

7
задан mishal153 22 April 2010 в 06:26
поделиться

2 ответа

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

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

11
ответ дан 6 December 2019 в 19:34
поделиться

Думаю, вы попали в самую точку. Если вы посмотрите на формулировку в документации Object.Finalize , там написано: См. Интерфейс IDisposable для дополнительных и более управляемых средств удаления ресурсов. «Дополняющий» означает «другой способ сделать это» и контролируемое существо… в точности то, что вы сказали.

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

2
ответ дан 6 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: