从而不会在被调用

时间:2022-05-26 08:02:50

在措施的设计过程中很多时候系统会要求对付某个类型在一个应用措施域中只呈现一次,或者是因为性能的考虑,或者是由于逻辑的要求,总之是有这样的需求的存在,那在设计模式中正好有这么一种模式可以来满足这样的要求。

在C#中实现单例模式可以通过界说私有的结构函数来实现,固然,还可以通过界说静态的结构函数来实现。在Singleton模式中可以操作类的静态结构器来执行完成单例模式的原因是当静态变量被访谒的时候CLR会挪用类的静态结构器(类型结构器),创建静态类的类型东西,,CLR但愿确保每个应用措施域内只执行一次类型结构器,为了做到这一点,在挪用类型结构器时,CLR会为静态类加一个互斥的线程同步锁,因此,如果多个线程试图同时挪用某个类型的静态结构器时,那么只有一个线程可以获得对静态类的访谒权,其他的线程都被梗阻。第一个线程执行完 类型结构器的代码并释放结构器之后,其他梗阻的线程被唤醒,然后发明结构器被执行过,因此,这些线程不再执行结构器,只是从结构器简单的返回。如果再一次挪用这些要领,CLR就会意识到类型结构器被执行过,从而不会在被挪用。挪用类中的静态要领,或者访谒类中的静态成员变量,过程同上,所以说静态成员是线程安适的。

看过上面的描述,可以了解到,静态成员在C#Runtime中进行了特殊的措置惩罚惩罚,出格适合成立单例模式。

public class Singleton { public static readonly Singleton _instance; static Singleton() { _instance=new Singleton(); } private Singleton() { } }

上面简短的几行代码就成立了一个标准的单利模式,此中,界说私有结构函数是为了防备使用new关键字在类的外部访谒结构函数,使用静态的结构函数,是为了初始化这个大众的,共全局访谒的只读字段_instance。从上面的解释来看,这种方法还可以免费的使用CLR送的互斥锁来同步执行并且CLR保证静态结构函数只被执行一次,也就是说,完美的实现了单例模式的所有要求。因此,这种要领无论从效率还是简洁上面都是最好的选择,还有一种双重判断的方法来实现单例模式:

public class AnotherSingleton { private AnotherSingleton() { } private static AnotherSingleton _instance; private static readonly object PadLock=new object(); public static AnotherSingleton GetInstance() { if (_instance==null) { lock (PadLock) { if (_instance==null) { _instance=new AnotherSingleton(); } } } return _instance; } }

操作上面这段代码也可以成立一个单例模式,但是由于使用锁,所以初始化方面时间要稍长一些,不过这段代码实现的单例模式也是适用于在多线程环境下运行的。以上两个例子就是最常用最好用的单例模式的实现方法。

由于单例模式不用考虑具体的使用环境,只要需求,就可以实现,所以这篇文章就没涉及到相应的场景。先到这里吧。