C#.NET单例类中的静态方法对性能或内存消耗有负面影响吗?

C#.NET单例类中的静态方法对性能或内存消耗有负面影响吗?,c#,.net,singleton,static-methods,C#,.net,Singleton,Static Methods,作为一个简单的例子,假设我有一个C#singleton类,如下所示: using System.Collections.Generic; public sealed class RestrictedNameCollection : List<string> { private static object _lock = new object(); private RestrictedNameCollection() { } private

作为一个简单的例子,假设我有一个C#singleton类,如下所示:

using System.Collections.Generic;

public sealed class RestrictedNameCollection : List<string>
{
    private static object _lock = new object();

    private RestrictedNameCollection()
    {
    }

    private static RestrictedNameCollection _instance;
    public static RestrictedNameCollection Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        var nameList = new List<string>();
                        nameList.Add("Jack");
                        nameList.Add("Jill");
                        nameList.Add("John");
                        nameList.Add("Jane");

                        var restrictedNameCollection = new RestrictedNameCollection();
                        foreach (var name in nameList)
                        {
                            restrictedNameCollection.Add(name);
                        }

                        _instance = restrictedNameCollection;
                    }
                }
            }
            return _instance;
        }
    }
}
或:

我可以通过调用
RestrictedNameCollection.Instance.IsRestrictedName(“Jack”)
来使用第一个版本。但为了简洁起见,我更愿意调用第二个版本
RestrictedNameCollection.IsRestrictedName(“Jack”)


我的问题是,有什么理由我应该远离这个方法的静态版本吗?这纯粹是一场句法辩论吗?或者我应该关注的是潜在的性能影响吗?

内存问题有点棘手,但基本上只要调用一次,所有数据(“jack”等)都将加载到内存中,并一直保留到dll卸载为止。在性能方面,我更担心线程安全。然而。。到了我想说的那一点。。你为什么要花这么多精力来填充一个列表?只需要做几个静态函数,比如“populatenames”和“populaterestricted”

我想你想得太多了……

我试着做了一个测试来测试性能差异。和您一样,我希望通过静态方法访问的单例与纯静态类一样好(也许更好)。现在,虽然在不同的条件下可能会更好,但我的结果似乎表明,这没有太大的差异,尽管纯单例似乎比静态方法单例或静态类来得慢


这不是最具决定性的测试,但它让我确信,任何首选版本都可能是正确的。

在不知道实例的情况下,根本不能调用实例方法。这需要使用实例属性getter。所以无论哪种方式,你都要为此付出代价。至少将if()语句体移动到单独的方法中,以便可以内联属性getter。如果这真的很重要,那就用一个静态构造函数来代替。那么,你为什么要用一个单例而不是静态类呢?Trey,我在这里写了一个例子,就是为了让我能够关注方法之间的差异。激发这一点的现实世界的单例实际上要复杂得多,但为了可读性,我简化了它。在所有的单例示例中,我看到内部方法通常是通过调用Instance.Whatever()来访问的,因此我很好奇为什么或者是否应该在单例类本身中避免访问实例的静态方法。
public bool IsRestrictedName(string name)
{
    return Contains(name);
}
public static bool IsRestrictedName(string name)
{
    return Instance.Contains(name);
}