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

时间:2013-09-11 19:08:46

标签: c# winforms

我有一个类,其中一个类成员是静态列表,它保留了我的所有对象,我只想创建一个列表(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);
    }
}

5 个答案:

答案 0 :(得分:7)

我会将它放在类的静态构造函数中,或者将其实例化为内联。

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# Static Constructors进一步阅读。

答案 1 :(得分:3)

对我而言,这是最好的方式:

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

答案 2 :(得分:2)

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

  

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

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

您可以找到更详细的解释here (Lazy and the Singleton Design Pattern)here (http://csharpindepth.com/articles/general/singleton.aspx)

答案 3 :(得分:1)

只需内联初始化即可。 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);
    }
}

答案 4 :(得分:0)

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

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