See also these related resources:
- Does the .NET garbage collector perform predictive analysis of code? (on Stack Overflow)
- WP7: When does GC Consider a Local Variable as Garbage (blog article on MSDN)
In other words:
Can an object referenced by a local variable be reclaimed before the variable goes out of scope (eg. because the variable is assigned, but then not used again), or is that object guaranteed to be ineligible for garbage collection until the variable goes out of scope?
Let me explain:
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) ...
}
In this code example, I obviously have to plan for the possibility that the new'ed object
is reclaimed by the garbage collector; therefore the if
statement.
(Note that I'm using weakRef
for the sole purpose of checking if the new'ed object
is still around.)
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);
}
The main change in this code example from the previous one is that the new'ed object
is strongly referenced by a local variable (unusedLocalVar
). However, this variable is never used again after the weak reference (weakRef
) has been created.
Question: Is a conforming C# compiler allowed to optimize the first two lines of Case_2
into those of Case_1
if it sees that unusedLocalVar
is only used in one place, namely as an argument to the WeakReference
constructor? i.e. is there any possibility that the assertion in Case_2
could ever fail?