如何在c#的构造函数中创建对象的静态列表
本文关键字:创建对象 静态 列表 构造函数 | 更新日期: 2023-09-27 18:03:40
我想维护一个已创建的类的所有实例的列表。我想我可以通过在构造函数中添加"this"到静态列表来做到这一点。当然c#不允许我在构造函数中引用"this",因为它还没有完全构造好。这是有道理的,但我正在努力找出最好的方法来完成这件事。
class Thing
{ static List<Thing> AllTheThings;
public Thing()
{
AllTheThings.Add(this); // can't reference 'this' here
}
}
我可以想到两种方法:
- 将构造函数设为私有,并创建一个静态方法('MakeNewThing')来调用构造函数并将新实例添加到列表中。我担心没有公共构造器的潜在问题,但我不确定它们是什么。
- 创建一个包含Thing的shell类('ThingShell')。ThingShell的构造函数创建一个Thing并将其添加到列表中。这是混乱的,需要ThingShell代理Thing的所有成员。
我似乎记得在大约20年前用c++做过类似的事情,但不记得细节,也找不到代码。
谁有更好的主意?正如@Jon Skeet所说,提到"this"应该没问题。但为了以防万一,这里有一个替代方法。
public class Thing
{
public readonly static List<Thing> AllTheThings = new List<Thing>();
//making the constructor private so that no other code can call it.
private Thing() { }
//providing a static instance method for creating the object
public static Thing Instance()
{
var t = new Thing();
Thing.AllTheThings.Add(t);
return t;
}
}
现在,在这个实现中需要注意的事情(请原谅双关语)是,通过由应用实例化的所有"事物"的静态列表,如果你没有办法在范围内不再需要时摆脱旧的"事物",你将冒内存天坑的风险。