Вопрос

При просмотре документации по таймеру Я наткнулся на следующий пример с этим комментарием:

родовое слово

Означает ли это, что сборщику мусора в C # разрешено собирать мусор локальные переменные, даже если это будет иметь побочные эффекты?Предположительно, потому что я больше не обращаюсь к таймеру после этого, GC может собрать его раньше?

Не уверен, что я поклонник такой оптимизации, если я правильно это понимаю (но тогда я, вероятно, не знаю;))

Это было полезно?

Решение

Да, GC может собирать локальную переменную перед окончанием объема, как только после последнего использования переменной.Помещение gc.eepalive в конце метода гарантирует, что переменная будет «живой» до тех пор, пока звонок Keepalive.

C # является императивным языком, поэтому GC не был разработан, чтобы узнать что-либо о побочных эффектах.

Другие советы

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

Обычно во время методов объекта или переменной остаются в области применения в течение продолжительности вызова метода, но если этот метод будет длиться дольше, чем время между циклами GC, GC может увидеть ваш объект таймера как вне области применения и отметкиЭто для сбора.Добавление метода gc.eepalive заставляет GC ждать до тех пор, пока метод не выходит перед выступлением на объект таймера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top