我有一个类,其中一个类成员是静态列表,它保留了我的所有对象,我只想创建一个列表(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);
}
}
答案 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);
}
}
答案 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并将这些实例存储在那里。