What is the correct way to store circular references in Unity?

Let’s suppose we have code like this:

public class ComponentA : MonoBehaviour {
    B b;
    void Start() {
        b = new B();
        b.a = this;
    }
}
public class B {
    public ComponentA a;
}

So will memory be freed (ComponentA destroyed) after destroying game object with attached ComponentA?

I’m not sure, but answer is yes. So for which reason there is WeakReference<> in System namespace?

C# uses a reachability test to find garbage, copied from Java, so circular references are fine. The language has weak references since dot-NET has them anyway, so why not?