C# 如何在一次又一次创建对象时只创建一次静态列表

C# 如何在一次又一次创建对象时只创建一次静态列表,c#,winforms,C#,Winforms,我有一个类,其中一个类成员是静态列表,它保留了我的所有对象,我只想创建这个列表(list list=new…)。 最好的方法是什么 public class MyObject { private string _name; private static List<Capture> _list; public MyObject(string name) { _name = name; } public void sta

我有一个类,其中一个类成员是静态列表,它保留了我的所有对象,我只想创建这个列表
(list 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);
    }
}
公共类MyObject
{
私有字符串\u名称;
私有静态列表_列表;
公共MyObject(字符串名称)
{
_名称=名称;
}
公开作废开始()
{
_列表。添加(此);
}
}

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

public class MyObject
{
    private static readonly List<Capture> _list = new List<Capture>();
}
公共类MyObject
{
私有静态只读列表_List=new List();
}

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

public class MyObject
{
    private static readonly List<Capture> _list = new List<Capture>();
}
公共类MyObject
{
私有静态只读列表_List=new List();
}

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

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);
    }
}
公共类MyObject
{
私有字符串\u名称;
//内联
//私有静态列表_List=新列表();
//如果通过静态构造函数
私有静态列表_列表;
静态MyObject()
{
_列表=新列表();
}
公共MyObject(字符串名称)
{
_名称=名称;
}
公开作废开始()
{
_列表。添加(此);
}
}

供进一步阅读。

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

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);
    }
}
公共类MyObject
{
私有字符串\u名称;
//内联
//私有静态列表_List=新列表();
//如果通过静态构造函数
私有静态列表_列表;
静态MyObject()
{
_列表=新列表();
}
公共MyObject(字符串名称)
{
_名称=名称;
}
公开作废开始()
{
_列表。添加(此);
}
}

进一步阅读。

只需内联初始化即可。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);
    }
}
公共类MyObject
{
私有字符串\u名称;
私有静态列表_List=新列表();
公共MyObject(字符串名称)
{
_名称=名称;
}
公开作废开始()
{
_列表。添加(此);
}
}

只需内联初始化即可。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);
    }
}
公共类MyObject
{
私有字符串\u名称;
私有静态列表_List=新列表();
公共MyObject(字符串名称)
{
_名称=名称;
}
公开作废开始()
{
_列表。添加(此);
}
}
我会在这里使用线程安全

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

private static Lazy\u list=
新懒惰(()=>
{
//填写你的清单
退货清单;
},对);
你可以找到更详细的解释,或者我会在这里使用线程安全

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

private static Lazy\u list=
新懒惰(()=>
{
//填写你的清单
退货清单;
},对);

您可以找到更详细的解释或

,因为之前的所有回答都提到了所有可能的方法,如静态ctor或静态块,我必须考虑其目的


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

因为前面的所有响应都提到了所有可能的方法,如静态ctor或静态块,我必须考虑其目的



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

将其放入自己的静态类中,但我想再次创建此类实例并再次将其输入自己的静态类中,但我想再次创建此类实例静态MyObject()之间的区别是什么和公共MyObject(字符串名称)?当你创建MyObject实例时会发生什么?@user2214609静态构造函数只在第一次访问类时调用一次,并且由于它是静态的,所以只能访问静态成员。这两个选项中哪一个更合适?(类的静态构造函数或内联实例化它)@user2214609:随便你喜欢。内联实例化代码更少。静态MyObject()和公共MyObject(字符串名)之间有什么不同?当你创建MyObject实例时会发生什么?@user2214609静态构造函数只在第一次访问类时调用一次,并且由于它是静态的,所以只能访问静态成员。这两个选项中哪一个更合适?(类的静态构造函数或内联实例化它)@user2214609:随便你喜欢。内联实例化的代码更少,这比它需要的工作量要大得多。只需以内联方式创建新列表……这比需要做的工作多得多。只需以内联方式创建新列表……当他只想创建一次列表时,最好记住
readonly
。@Alessandro:OP的问题中有一个与之无关的问题:这种初始化形式在编译时是否等同于静态构造函数?这个初始化是什么时候调用的?@Alireza是的,这是等效的。内联和构造函数之间有区别,区别在于字段初始化的时间。看看@AlessandroD'Andria,对于