写本文主要涉及到的基础知识还是比较多,比如单例里我们经常谈到加锁和线程的问题,还有比如“私有构造函数,静态构造函数,静态字段,readonly和const的区别等等“。
方案一:Recruiter
using System;
public sealed class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
这个版本的主要问题,就是线程安全的问题,当2个请求同时方式这个类的实例的时候,可以会在同一时间点上都创建一个实例,虽然一般不会出异常错误,但是起码不是我们谈论的只保证一个实例了。
方案二
public sealed class Singleton
{
// 在静态私有字段上声明单例
private static readonly Singleton instance = new Singleton();
// 私有构造函数,确保用户在外部不能实例化新的实例
private Singleton(){}
// 只读属性返回静态字段
public static Singleton Instance
{
get
{
return instance;
}
}
}
标记类为sealed是好的,可以防止被集成,然后在子类实例化,使用在静态私有字段上通过new的形式,来保证在该类第一次被调用的时候创建实例,是不错的方式,但有一点需要注意的是,C#其实并不保证实例创建的时机,因为C#规范只是在IL里标记该静态字段是BeforeFieldInit,也就是说静态字段可能在第一次被使用的时候创建,也可能你没使用了,它也帮你创建了,也就是周期更早,我们不能确定到底是什么创建的实例。
方案三
public sealed class Singleton
{
// 依然是静态自动hold实例
private static