1

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

5 回答 5

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# 静态构造函数供进一步阅读。

于 2013-09-11T19:12:33.627 回答
3

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

public class MyObject
{
    private static readonly List<Capture> _list = new List<Capture>();
}
于 2013-09-11T19:12:29.747 回答
2

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

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

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

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

于 2013-09-11T19:16:03.313 回答
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);
    }
}
于 2013-09-11T19:13:19.943 回答
0

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

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

于 2013-09-11T19:27:51.857 回答