Смотрите также эти ресурсы:Может ли соответствующий C# компилятор оптимизировать локальную (но неиспользуемую) переменную, если она является единственной сильной ссылкой на объект?
- Does the .NET garbage collector perform predictive analysis of code? (на Stack Overflow)
- WP7: When does GC Consider a Local Variable as Garbage (блог статьи на 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) ...
}
В этом примере кода, я, безусловно, должны планировать возможность того, что new'ed object
будет утилизирован сборщиком мусора; поэтому заявление if
.
(Обратите внимание, что я использую weakRef
с единственной целью проверки, если new'ed 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);
}
Основное изменение в этом примере кода из предыдущего заключается в том, что в new'ed object
строго указана локальная переменная (unusedLocalVar
). Однако эта переменная никогда не используется снова после того, как была создана слабая ссылка (weakRef
).
Вопрос: ли соответствующий требованиям C# компилятор позволил оптимизировать первые две строки Case_2
в тех Case_1
, если он видит, что unusedLocalVar
используется только в одном месте, а именно в качестве аргумента в WeakReference
конструктора? то есть есть ли вероятность, что утверждение в Case_2
могло бы потерпеть неудачу?
Также обратите внимание, что в отладочных сборках переменная явно сохраняется до конца области для просмотра отладчиком - только в версиях вы увидите это поведение. –
@ Энди - интересный момент. Не то чтобы это важно, но я предполагаю, что это поведение управляется JITter? –
И для полноты, поэтому установка 'unusedLocalVar = null' в _end_ метода обычно является де-оптимизацией. –