如何一次又一次地创建我的对象时只创建一次我的静态列表
本文关键字:我的 创建 列表 一次 静态 一次又一次 对象 | 更新日期: 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并将这些实例存储在那里。