【发布时间】:2015-07-20 00:02:06
【问题描述】:
我想维护已创建的类的所有实例的列表。我想我可以通过从构造函数中将“this”添加到静态列表来做到这一点。当然,C# 不允许我在构造函数中引用“this”,因为它尚未完全构造。这是有道理的,但我正在尝试找出实现这一目标的最佳方法。
class Thing
{ static List<Thing> AllTheThings;
public Thing()
{
AllTheThings.Add(this); // can't reference 'this' here
}
}
我可以想到两种方法:
- 将构造函数设为私有并创建一个静态方法 ('MakeNewThing'),该方法调用构造函数并将新实例添加到列表中。 我担心没有公共构造函数的潜在问题,但我不确定它们是什么。
- 创建一个包含 Thing 的 shell 类 ('ThingShell')。 ThingShell 的构造函数创建一个事物并将其添加到列表中。 这很麻烦,需要 ThingShell 代理 Thing 的所有成员。
我似乎记得大约 20 年前在 C++ 中做过类似的事情,但不记得细节,也找不到代码。
谁有更好的想法?
【问题讨论】:
-
您发布的代码运行良好,只是您从未初始化
AllTheThings。在构造函数body 中引用this是完全合法的。请发布实际上对您来说失败的代码。您不能在构造函数 initializer 中使用this,例如base(this.Foo()) -
"关键字
this在静态属性、静态方法或静态字段初始化程序中无效" -- 我在尝试代码时得到的结果。 @JonSkeet :) -
噢!我非常专注于“这个”,以至于我完全错过了 AllTheThings 未初始化。谢谢!这行得通。
-
@AfzaalAhmadZeeshan:我刚刚编译了这个 exact 代码,我没有收到那个错误。你确定你编译了那个确切的代码吗?我对此表示怀疑。
-
是的,我上面的代码可以正常编译,但是当它引用未初始化的 AllTheThings 列表时会出现异常。初始化解决问题。当我得到异常时,我误读为“this”为空,而实际上它是列表。谢谢 Jon Skeet 让我直截了当!
标签: c# constructor