C# 创建单例的多种方式
关于为什么需要创建单例?这里不过多介绍,具体百度知。
关于C# 创建单例步骤或条件吧
1、声明静态变量;
2、私有构造函数(无法实例化)
3、静态创建实例的方法;至于我这里的Singleton是sealed,只是为了防止被继承,其实有私有构造函数足够了,这里只是为了代码可读性。
第一种常见的方式创建单例:
//////不安全的单例 /// publicsealedclassSingleton { privatestaticSingleton_Singleton; privateSingleton(){} publicstaticSingletonGetSingleton() { if(_Singleton==null) { _Singleton=newSingleton(); } return_Singleton; } }
注:为什么说是不安全的单例,多线程访问时可能会new多个对象...
第二种方式创建单例:
//////(多线程)安全单例 /// publicsealedclassSingleton { privatestaticSingleton_Singleton; privatestaticreadonlyobjectobj=newobject(); privateSingleton(){} publicstaticSingletonGetSingleton() { if(_Singleton==null) { //加锁保护,在多线程下可以确保实例值被创建一次。缺点是每次获取单例,都要进行判断,涉及到的锁和解锁比较耗资源。 lock(obj) { if(_Singleton==null) { _Singleton=newSingleton(); } } } return_Singleton; } }
注:为了解决上面第一种方式创建的不安全实例问题应用而生。
第三种方式创建单例:
//////只读单例 /// publicsealedclassSingleton { privatestaticreadonlySingletoninstance=newSingleton(); privateSingleton(){} publicstaticSingletonInstance { get { returninstance; } } }
//////基于上面的只读单例=自动属性只读单例(语法糖) /// publicsealedclassSingleton { privateSingleton(){} publicstaticSingletonInstance{get;}=newSingleton(); }
注:只读属性式=>借助readonly属性,instance只被初始化一次,同样达到了单例的效果。在引用函数执行第一句话之前,instance其实已经被赋值了,并不是预期的只有到访问Instance变量时才创建对象。
第四种方式创建单例:
//////Singleton中加上静态构造函数。 /// publicsealedclassSingleton { publicstaticreadonlySingletoninstance=newSingleton(); privateSingleton() { Console.WriteLine("初始化1!"); } staticSingleton() { } publicstaticSingletonInstance { get{returninstance;} } }
注:为了解决(第三种只读属性实例)在执行第一句代码之前,实例已经被初始化问题。
第五种方式创建单例:
//////使用Lazy创建单例,默认是线程安全的 /// publicsealedclassSingleton { privatestaticreadonlyLazyinstance=newLazy (()=>newSingleton());// privateSingleton(){} publicstaticSingletonInstance { get { returninstance.Value; } } }
//贴一下关于上面Lazys=newLazy ()参数的定义; //摘要: //初始化System.Lazy`1类的新实例。懒惰初始化时 //发生时,使用指定的初始化函数和初始化模式。 //参数: //valueFactory: //被调用以生成延迟初始化值的委托是必需的参数 // //isThreadSafe: //如果要使此实例可由多个线程同时使用,则为true;false //使此实例一次只能由一个线程使用。 publicLazy(Func valueFactory,boolisThreadSafe);
以上就是C#创建单例的多种方式的详细内容,更多关于c#创建单例的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。