C# - Singleton Pattern

本文关键字:Pattern Singleton | 更新日期: 2023-09-27 18:20:58

正如你从我的昵称中看到的那样,我是一个真正学习Singleton模式的新手,在那里我遇到了一个问题。在我了解静态构造函数总是在标准构造函数之前执行之前,但在下面的代码中,结果不同,首先我看到的是"Insta"字符串,然后是"static",为什么会发生这种情况?

sealed class Singleton
{
    private static readonly Singleton instance;
    private Singleton()
    {
        Console.WriteLine("Insta");
    }
    static Singleton()
    {
        instance  = new Singleton();
        Console.WriteLine("Static");
    }
    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}
class Program
{
    static void Main()
    {
        Singleton s1 = Singleton.Instance;
    }
}

C# - Singleton Pattern

如果您要编写

static Singleton()
{
    Console.WriteLine("Static"); //THIS COMES FIRST
    instance  = new Singleton();
}

你会看到你所期望的

正如预期的那样,静态ctor首先被执行,但您在控制台上打印instance = new Singleton();行,但这行执行实例ctor,所以"inst"。

所以执行流程:

  • 静态ctor
    • instance = new Singleton();
      • 实例ctor打印"insta"
    • "静态"

请参阅此处的MSDN模式,以获得对singleton模式的质量解释。

MSDN建议您应该按照以下方式编写它,这样它才是线程安全的:

using System;
public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();
   private Singleton() {}
   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }
         return instance;
      }
   }
}
 

顺便说一句,与静态构造函数相比,这种模式具有以下优势:

在对象请求实例之前,不会执行实例化;这种方法被称为惰性实例化。懒惰的实例化避免了在应用程序启动时实例化不必要的singleton。

看看这是否满足您的需求,如果满足,请实施此解决方案。

首先调用静态方法。这是证据——将您的代码更改为以下代码:

static Singleton()
    {
        Console.WriteLine("Static method start");
        instance  = new Singleton();
        Console.WriteLine("Static method end");
    }