介绍
这期内容当中小编将会给大家带来有关在c#中创建单例的方法有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
第一种常见的方式创建单例:,
///, & lt; summary> ,///不安全的单例 ,///& lt;/summary> ,public sealed  class 单例 ,{ private 才能static Singleton  _Singleton; private 才能;单例(),{,} public 才能static Singleton  GetSingleton () {才能 ,,if (_Singleton ==, null) ,,{ ,,,_Singleton =, new 单例(); ,,} ,,return _Singleton; ,,} 以前,}>注:为什么说是不安全的单例,多线程访问时可能会新多个对象……
第二种方式创建单例:
///, & lt; summary> ,///(多线程)安全单例 ,///& lt;/summary> ,public sealed  class 单例 ,{ private 才能static Singleton  _Singleton; private 才能static readonly  object obj =, new 对象(); private 才能;单例(),{,} public 才能static Singleton  GetSingleton () {才能 ,,if (_Singleton ==, null) ,,{ ,,,//加锁保护,在多线程下可以确保实例值被创建一次。缺点是每,次获取单例,都要进行判断,涉及到的锁和解锁比较耗资源。 ,,,lock (obj) ,,,{ ,,,,if (_Singleton ==, null) ,,,,{ ,,,,,_Singleton =, new 单例(); ,,,,} ,,,} ,,} ,,return _Singleton; ,,} 以前,}>注:为了解决上面第一种方式创建的不安全实例问题应用而生。
第三种方式创建单例:
///, & lt; summary> ,///只读单例 ,///& lt;/summary> ,public sealed  class 单例 ,{ private 才能static readonly  Singleton instance =, new 单例(); private 才能;单例(),{,} public 才能;static  Singleton 实例 {才能 ,才能得到的 ,,{ ,,,return 实例; ,,} ,,} 以前,}>///, & lt; summary> ,///基于上面的只读单例=自动属性只读单例(语法糖) ,///& lt;/summary> ,public sealed  class 单例 ,{ private 才能;单例(),{,} public 才能static Singleton  Instance {,得到;},=,new 单例(); 以前,}>注:只读属性式=祝辞借助只读的属性,实例只被初始化一次,同样达到了单例的效果。在引用函数执行第一句话之前,例如其实已经被赋值了,并不是预期的只有到访问实例变量时才创建对象。
第四种方式创建单例:
///, & lt; summary> ,///单例中加上静态构造函数。 ,///& lt;/summary> ,public sealed  class 单例 ,{ public 才能static readonly  Singleton instance =, new 单例(); private 才能;单例() {才能 ,,Console.WriteLine(“初始化1 !“); ,,} static 才能;单例() {才能 ,,} public 才能;static  Singleton 实例 {才能 ,,get {, return 实例,} ,,} 以前,}>注:为了解决(第三种只读属性实例)在执行第一句代码之前,实例已经被初始化问题。
第五种方式创建单例:
///, & lt; summary> ,///使用懒惰创建单例,默认是线程安全的 ,///& lt;/summary> ,public sealed  class 单例 ,{ private 才能static readonly  Lazy, instance =, new Lazy ((),=祝辞,new 单例());//private 才能;单例(),{,} public 才能;static  Singleton 实例 {才能 ,才能得到的 ,,{ ,,,return instance.Value; ,,} ,,} 以前,}> //,贴一下关于上面Lazy, s=new Lazy ()参数的定义;//,才能摘要://才能,初始化System.Lazy“1类的新实例只懒惰初始化时//,,,发生时,使用指定的初始化函数和初始化模式。 ,,//才能,参数://才能,valueFactory://,才能被调用以生成延迟初始化值的委托是必需的参数 ,////才能,isThreadSafe://,才能,如果要使此实例可由多个线程同时使用,则为真,假的 ,,,,,,,,//使此实例一次只能由一个线程使用。 public 才能;懒惰(Func 在c#中创建单例的方法有哪些