【问题标题】:private constructor and static constructor in singleton pattern单例模式中的私有构造函数和静态构造函数
【发布时间】:2018-04-23 04:00:20
【问题描述】:

我是一名 c# 开发人员。

我对单例模式中的私有构造函数和静态构造函数感到困惑。

下面是我的示例代码:

标准单例模式,它是线程安全的:

public class SingletonTest
{
    private static readonly Lazy<RedisCacheManager> CacheManager = new Lazy<RedisCacheManager>(() => new RedisCacheManager());

    /// <summary>
    /// singleton pattern
    /// </summary>
    private SingletonTest() { }

    public static RedisCacheManager Instance
    {
        get { return CacheManager.Value; }
    }
}

第二次将私有构造函数改为静态构造函数:

public class SingletonTest
{
    private static readonly Lazy<RedisCacheManager> CacheManager = new Lazy<RedisCacheManager>(() => new RedisCacheManager());

    /// <summary>
    /// static(single object in our application)
    /// </summary>
    static SingletonTest() { }

    public static RedisCacheManager Instance
    {
        get { return CacheManager.Value; }
    }
}

我的问题是第二个代码仍然是单例模式之一,还是它总是在我们的应用程序中保留一个对象(RedisCacheManager)? 有人帮帮我,谢谢。

【问题讨论】:

  • 没有所谓的“静态构造函数”。
  • 看看这个link

标签: constructor singleton


【解决方案1】:

所以要回答你的问题,我们需要进入基础。

静态构造函数具有以下属性:

  1. 在创建第一个实例或任何静态成员之前,会自动调用静态构造函数来初始化类 参考。
  2. 不能直接调用静态构造函数。
  3. 如果静态构造函数抛出异常,运行时将不会再次调用它,并且类型将保持未初始化状态 您的程序所在的应用程序域的生命周期 正在运行。

但是对于标准单例模式

  1. 当我们调用它时,它将被加载。所以我们可以控制何时创建单例对象。
  2. 用户可以完全控制何时调用它。

希望它能回答你的问题。

【讨论】:

  • 所以他们都在我们的应用程序生命周期内保持一个实例。静态实例是在项目启动时由翻译器创建的,而单例实例是在我们调用它时创建的?
  • 是的静态我们没有任何控制,但例如我们有
猜你喜欢
  • 2013-11-15
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 2013-03-05
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多