См. также эти связанные ресурсы:
- Выполняет ли сборщик мусора .NET прогностический анализ кода? (on Stack Overflow)
- WP7: Когда GC рассматривает локальную переменную как мусор (статья в блоге в MSDN)
Другими словами:
Может ли объект, на который ссылается локальный переменная должна быть исправлена до переменная выходит за рамки (например. потому что переменная назначена, но затем не используется снова), или это объект гарантированно не подлежит сбор мусора до тех пор, пока переменная выходит за рамки?
Позвольте мне объяснить:
void Case_1()
{
var weakRef = new WeakReference(new object());
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
if (weakRef.IsAlive) ...
}
В этом примере кода я, очевидно, должен планировать возможность того, что новый object
будет возвращен сборщиком мусора; поэтому оператор if
.
(Обратите внимание, что я использую weakRef
с единственной целью проверить, находится ли новый object
.)
void Case_2()
{
var unusedLocalVar = new object();
var weakRef = new WeakReference(unusedLocalVar);
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
Debug.Assert(weakRef.IsAlive);
}
Основное изменение в этом примере кода из предыдущего состоит в том, что новый object
сильно ссылается на локальную переменную (unusedLocalVar
). Однако эта переменная никогда не используется снова после того, как была создана слабая ссылка (weakRef
).
Вопрос:. Соответствующий С# -компилятор разрешил оптимизировать первые две строки Case_2
по сравнению с Case_1
, если видит, что unusedLocalVar
используется только в одном месте, а именно: аргумент конструктору WeakReference
? т.е. существует ли вероятность того, что утверждение в Case_2
могло бы потерпеть неудачу?