如何一次又一次地创建我的对象时只创建一次我的静态列表

本文关键字:我的 创建 列表 一次 静态 一次又一次 对象 | 更新日期: 2023-09-27 18:31:07

我有一个类,其中一个类成员是静态列表,它保留了我的所有对象,我只想(List<myObject> list = new ...)一次创建此列表。最好的方法是什么?

public class MyObject
{
    private string _name;
    private static List<Capture> _list;
    public MyObject(string name)
    {
        _name = name;
    }
    public void start()
    {
        _list.Add(this);
    }
}

如何一次又一次地创建我的对象时只创建一次我的静态列表

我会把它放在类的静态构造函数中或内联实例化它。

public class MyObject
{
    private string _name;
    // inline
    // private static List<Capture> _list = new List<Capture>();
    // if via static constructor
    private static List<Capture> _list;
    static MyObject() 
    {
        _list = new List<Capture>();
    }
    public MyObject(string name)
    {
        _name = name;
    }
    public void start()
    {
        _list.Add(this);
    }
}

MSDN C# 静态构造函数,以便进一步阅读。

对我来说,这是最好的方法:

public class MyObject
{
    private static readonly List<Capture> _list = new List<Capture>();
}

我会在这里使用线程安全Lazy<T>

可以使用其默认行为是创建线程安全的 Lazy 对象的简单构造函数之一,以便无论有多少线程尝试访问该对象,都只创建该延迟实例化对象的一个实例。

private static Lazy<List<Capture>> _list = 
        new Lazy<List<Capture>>(() =>
        {
            //fill your list
            return list;
        }, true);

你可以在这里找到更详细的解释(懒惰和单例设计模式)或这里(http://csharpindepth.com/articles/general/singleton.aspx)

只需内联初始化即可。 C# 保证静态对象在访问之前仅初始化一次。

public class MyObject
{
    private string _name;
    private static List<Capture> _list = new List<Capture>();
    public MyObject(string name)
    {
        _name = name;
    }
    public void start()
    {
        _list.Add(this);
    }
}

由于之前的所有回复都提到了所有可能的方法,如静态 ctor 或静态块,我必须考虑目的。

根据关注点分离或单一责任模式,应该有另一个类,它将包含所有实现的列表,而不是实现本身,即使是以静态方式。最简单的解决方案是使用工厂(不是工厂方法)以及包可见的ctor并将这些实例存储在那里。