【问题标题】:What is an efficient way to implement singleton pattern in C#? [closed]在 C# 中实现单例模式的有效方法是什么? [关闭]
【发布时间】:2013-12-05 04:26:04
【问题描述】:

这个问题是在我处理 Java 的类似问题时提出的。 What is an efficient way to implement a singleton pattern in Java?

我们可以在 C# 中实现类似的东西吗?

【问题讨论】:

  • 在代码审查中查看thread
  • 无论你为 java 找到什么,在 C# 中可能有更好、更少代码、更漂亮的方法。
  • @HighCore 如果相同,那么根据定义,也不是更好。这是相同的。如果 C# 的语言特性使这个特定任务比 Java 更有效,那可能值得评论,但由于没有,我看不出重点。
  • @servy 没有意义,你没看到吗?我只是在开玩笑......

标签: c# design-patterns singleton


【解决方案1】:

您必须检查过 Jon Skeet 的 Implementing the Singleton Pattern in C#

然而,所有这些实现都有四个共同特征:

  • 单个构造函数,它是私有且无参数的。这可以防止其他 >> 类实例化它(这将违反模式)。请注意,它也阻止了子类化——如果一个单例可以被子类化一次,它可以被子类化 > 两次,并且如果这些子类中的每一个都可以创建一个实例,则违反了该模式。如果您需要基类型的单个实例,则可以使用工厂模式,但确切的类型要到运行时才能知道。
  • 班级被密封。严格来说,由于上述原因,这是不必要的,但可能有助于 JIT 进行更多优化。
  • 一个静态变量,它包含对单个创建实例的引用(如果有)。
  • 一种获取对单个创建实例的引用的公共静态方法,必要时创建一个。
public class Singleton 
{
    static readonly Singleton _instance = new Singleton();

    static Singleton() { }

    private Singleton() { }

    public static Singleton Instance
    {
        get  { return _instance; }
    }
}

【讨论】:

  • 比起static public,我更喜欢public static
  • @RahulTripathi 它没有(假设它足够有效,可以编译)。但是,对于这样的修饰符的排序有一个约定,public static 肯定是规范。
  • @TimS.:- 非常感谢先生。我会检查 +1!
【解决方案2】:

实现一个的常用方法

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

    private Singleton() {}
    static Singleton() {}

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

【讨论】:

    【解决方案3】:
    public class Singleton
     {
            private static Singleton instance = null;
    
            public static Singleton Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new Singleton ();
                    }
                    return instance;
                }
            }
    

    【讨论】:

      【解决方案4】:

      我为你找到了一些:

      Jon Skeet's.

      这个post

      还有this one

      不过,归根结底,这些都是非常主观的,因此,您需要做最适合您和您想要完成的事情。

      【讨论】:

        猜你喜欢
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 2016-08-31
        • 2021-11-24
        相关资源
        最近更新 更多