【问题标题】:how to create a static list of objects within their constructor in c#?如何在 C# 的构造函数中创建对象的静态列表?
【发布时间】: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
  }

}

我可以想到两种方法:

  1. 将构造函数设为私有并创建一个静态方法 ('MakeNewThing'),该方法调用构造函数并将新实例添加到列表中。 我担心没有公共构造函数的潜在问题,但我不确定它们是什么。
  2. 创建一个包含 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


【解决方案1】:

正如@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;
    }
}

现在,在此实现中要注意的事情(请原谅双关语)是,通过让应用程序实例化所有“事物”的静态列表,如果不这样做,您将面临内存沉洞的风险当范围内不再需要旧的“事物”时,有办法摆脱它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2011-06-04
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多