c# - Singleton Alternative - 它是等价的吗?

标签 c# performance c#-4.0 singleton

我知道标准的单例模式是这样的:

原创

public class Singleton1
{

    public static Singleton1 _Instance;
    public static Singleton1 Instance
    {
        get
        {
            if (_Instance == null)
            {
                _Instance = new Singleton1();
            }
            return _Instance;
        }
    }

    private Singleton1()
    {

    }
}

但是这段代码似乎是不必要的。对我来说,您可以使用以下任一简单设计模式来完成同样的事情:

版本 2

public class Singleton2
{
    public static readonly Singleton2 Instance = new Singleton2();
    
    private Singleton2()
    {
    }
}

版本 3

public class Singleton3
{
    static Singleton3()
    {
    }
}

对我来说,版本 2 似乎是执行此操作的更好方法,因为它允许您传入(或不传入)参数,但实例数量仍然有限。我的应用程序对延迟/性能相当敏感 - 这些模式中的任何一种都可以提高性能吗?

似乎第一次访问每个对象的时间会更长,因为正在创建对象。此外,原始版本似乎稍微慢一点,因为每次其他东西访问它时,它都必须检查其支持字段是否为空。

最佳答案

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
}

快速、干净、线程安全。

关于c# - Singleton Alternative - 它是等价的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451672/

相关文章:

c# - 文本框和线程

mysql - 为什么带有子查询和 JOIN 的 SELECT 如此慢?

c# - 从工作线程调用时 TaskScheduler.FromCurrentSynchronizationContext 异常

c# - 一种记录在 C# 中执行方法所花费时间的有效方法

c# - 单元测试 Winforms UI

c# - 当我选择添加 Controller 时,为什么下拉列表中缺少我的数据上下文类?

c# - 如何在给定 DbCommand 或 DbConnection 的情况下创建 DbDataAdapter?

linux - 分析缓存驱逐

performance - 训练某些网络时,Keras(Tensorflow 后端)在 GPU 上比在 CPU 上慢

asp.net-mvc-2 - 电子商店中类别名称的 MVC 2.0 动态路由