См. Также следующие ресурсы:
Другими словами:
Может ли объект, на который ссылается местный
переменная должна быть исправлена до
переменная выходит из области видимости (например,
потому что переменная назначена, но
затем не используется снова), или это
объект гарантированно не подходит для
сборка мусора до переменной
выходит за рамки?
Позвольте мне объяснить:
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
с единственной целью проверки, если новый '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
может когда-нибудь потерпеть неудачу?