如何在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
  }
}

我可以想到两种方法:

  1. 将构造函数设为私有,并创建一个静态方法('MakeNewThing')来调用构造函数并将新实例添加到列表中。我担心没有公共构造器的潜在问题,但我不确定它们是什么。
  2. 创建一个包含Thing的shell类('ThingShell')。ThingShell的构造函数创建一个Thing并将其添加到列表中。这是混乱的,需要ThingShell代理Thing的所有成员。

我似乎记得在大约20年前用c++做过类似的事情,但不记得细节,也找不到代码。

谁有更好的主意?

如何在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;
    }
}

现在,在这个实现中需要注意的事情(请原谅双关语)是,通过由应用实例化的所有"事物"的静态列表,如果你没有办法在范围内不再需要时摆脱旧的"事物",你将冒内存天坑的风险。