7

正如您从我的昵称中看到的那样,我实际上是学习单例模式的新手,但我遇到了一个问题。在我了解到静态构造函数总是在标准构造函数之前执行,但是在下面的这段代码中,结果是不同的,首先我看到“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;

    }

}
4

3 回答 3

13

如果你会写

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

}

你会看到你所期望的

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

所以执行流程:

  • 静态函数
    • instance = new Singleton();
      • 实例 ctor 打印“insta”
    • “静止的”
于 2013-07-03T20:45:20.520 回答
9

有关单例模式的质量解释,请参阅此处的 MSDN模式。

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;
      }
   }
}
 

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

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

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

于 2013-07-03T20:48:19.287 回答
1

首先调用静态方法。这是证明 - 将您的代码更改为以下内容:

static Singleton()
    {
        Console.WriteLine("Static method start");
        instance  = new Singleton();
        Console.WriteLine("Static method end");
    }
于 2013-07-03T20:53:07.513 回答