Consider these two classes:
public class A
{
B b;
public A(B b) { this.b = b; }
}
public class B
{
A a;
public B() { this.a = new A(this); }
}
If I have classes designed like above, would the objects of such classes be collected by Garbage Collector (GC)?
Suppose I do this:
void f()
{
B b = new B();
}
In this method, I create an instance of B
called b
, and when the method returns, b
goes out of scope, and the GC should be able to collect it, but if it were to collect it, it would have to collect a
first which is the member of B
, and to collect a
, it needs to collect b
first which is the member of A
. It becomes circular. So my question is : is such circular reference going to prevent GC from collecting the objects?
WeakReference
class? What is its purpose?The .Net garbage collector can absolutely handle circular references. The very high level view of how the garbage collector works is ...
This allows for circular references to be collected just fine. So long as none of them are reachable from an object known to be uncollectable then the circular reference is essentially irrelevant.
Note: I realize I've left out many fun details in order to keep this answer simple and direct