【问题标题】:c# Singleton Pattern vs Static Propertyc# 单例模式 vs 静态属性
【发布时间】:2016-03-03 14:02:30
【问题描述】:

当我尝试使用同一类的 2 个不同版本时,它们的行为实际上是相同的。

我已搜索但找不到此问题的满意答案

下面2个例子中的Singleton和静态属性有什么区别,关于初始化时间?以及如何观察差异?

编辑:我不问静态类和单例的区别。它们都是非静态的,唯一的区别是,第一个在 Instance 属性中初始化,第二个直接初始化

public sealed class Singleton
{
    private static Singleton instance;

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

public sealed class Singleton2
{
    private static Singleton2 instance = new Singleton2();

    private Singleton2()
    {
    }

    public static Singleton2 Instance
    {
        get
        {
            return instance;
        }
    }
}

【问题讨论】:

标签: c# static singleton


【解决方案1】:

您的第一个单例实现不是线程安全的;如果多个线程尝试同时创建一个单例,则最终可能会创建两个实例。您的第二个实现没有这个缺陷。

除此之外,它们在功能上是相同的。

【讨论】:

  • 我认为第二个实现也不是线程安全的,但可以实现。你是这个意思吗?如果是,我们可以看出它们是完全相同的,但是如果我们想实现一个线程安全机制,很明显我们可以用第二个来做到这一点
  • @rastbin 那是错误的。无法在第二个实例中创建类的多个实例。显然 one 实例的状态的使用在任何一种情况下都需要同步,但是实例的 creation 在后者中是线程安全的,而不是在前者中。
【解决方案2】:

Singleton 类的实例将在 Singleton.Instance 方法第一次请求时创建。

Singleton2 的实例将在其类型初始化时创建,这可能由多种机制引起。它肯定会在访问 Singleton2 类上的任何属性或方法之前创建

【讨论】:

  • typeof(Singleton2) 不会实例化静态字段
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
相关资源
最近更新 更多