我最近使用 C# 在 Microsoft.Ink dll 中工作并正在调试一个问题(与此无关)我注意到,当我调试它时,墨水对象有一个笔画对象,它有一个墨水对象, 其中有....等
这让我很困惑,因为我假设你不能这样做(我来自 C++ 背景)
但我忽略了它,解决了问题,然后继续前进。今天,我遇到了一个类似的问题,因为我查看了一个类,该类有一个私有(private)成员,该成员与它本身是同一个类。
public sealed class Factory
{
private static Factory instance = new Factory();
}
这怎么可能?我现在可以调用 instance.instance.instance.instance...等等。正如您所想象的那样,这会伤害我的凡人大脑,而且我敢肯定它在计算机上也不会很好。编译器如何处理这个?兔子洞到底有多深?
最佳答案
因为它是静态的,因此在 AppDomain 中只有一个变量 instance
的副本。
你想到的是这个:
public class Foo
{
private Foo lol = new Foo();
}
注意,这里的一切都是实例,而不是静态的。
正如评论者(很久以前)指出的那样,这在语法上是有效的,但会导致抛出 StackOverflowException,因为赋值需要构造,而构造会创建一个新的赋值。一个在调用堆栈达到其最大长度时结束的循环中触发另一个。
在 OP 的示例中,赋值需要构造,但赋值是由 static constructor 触发的,而不是实例构造函数。静态构造函数只在 AppDomain 中执行一次,以初始化类的类型。它不是由实例构造触发的,因此(在 OP 的示例中)不会导致堆栈溢出。
关于c# - 声明一个类作为它自己的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/952512/