I was working in the Microsoft.Ink dll recently using C# and was debugging a problem (which is not related to this) I noticed, that when I was debugging it, ink objects had a strokes object, which had an ink object, which had…. etc.
This confused me, as I was under the assumption you could not do this (I come from a C++ Background)
But I ignored it, solved the problem, and moved on. Today, I run into a similar problem, as I look at a class which had a private member which was the same class as itself.
public sealed class Factory
{
private static Factory instance = new Factory();
}
How is that even possible? I can now call instance.instance.instance.instance…etc. This, as you can imagine, hurts my mortal brain, and I’m sure it can’t be good on the computer either. How does the compiler deal with this? And Just how deep does the rabbit hole go?
Because it’s static and therefore there is only one copy of the variable
instancewithin the AppDomain.What you’re thinking of is this:
Notice, everything here is instance, not static.
As the commenters noted (long ago), this is valid syntactically, but would result in a StackOverflowException being thrown, as the assignment requires construction, and construction creates a new assignment. One triggers the other in a cycle that ends when the call stack reaches its maximum length.
In OP’s example, assignment requires construction, but the assignment is triggered by the static constructor, not the instance constructor. The static constructor only executes once within an AppDomain, in order to initialize the class’ Type. It isn’t triggered by instance construction, and so (in OP’s example) won’t result in a stack overflow.