См. также эти связанные ресурсы:
- Сборщик "мусора".NET выполняет упреждающий анализ кода? (на Переполнении стека)
- 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) ... }
В этом примере кода я, очевидно, должен запланировать возможность что new'ed
object
исправлен сборщиком "мусора"; поэтомуif
оператор.(Обратите внимание, что я использую
weakRef
для единственной цели проверить, если new'edobject
все еще вокруг.)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
мог когда-либо перестать работать?
Неважно, что делает компилятор C # - JITter / GC разрешено очищать локальные ссылки, когда они больше не существуют в теле метода. Посмотрите на документы для GC.KeepAlive
Кроме того, эта презентация powerpoint , особенно начиная со слайда 30 и далее, помогает объяснить, на что способен JIT / GC.
{{1} }