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;
}
}
如果您要编写
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");
}