c# - 声明一个类作为它自己的成员

标签 c# oop

我最近使用 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/

相关文章:

C++:std::map 抛出 out_of_range 异常

python - 如何访问和修改 LabTestRepository 类中的 __list_of_hospital_lab_test_ids?

c# - 如何让 Windows 服务 self 更新?

c# - 使用 DeveXpress 在 C# 中自动设置垂直列标题的高度

python - 仅为python中的所有对象创建一个pexpect session

c++ - 编译器找不到基类的方法

C++:对 child 隐藏方法

c# - 添加数据后如何滚动到 ListView 的末尾 - WPF

c# - 模板生成器中 sitecore 'source' 字段的查询符号

c# - C#中的YouTube API视频上传解析错误