在C#中创建单例的方法有哪些
这期内容当中小编将会给大家带来有关在C#中创建单例的方法有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
第一种常见的方式创建单例:
///<summary> ///不安全的单例 ///</summary> publicsealedclassSingleton { privatestaticSingleton_Singleton; privateSingleton(){} publicstaticSingletonGetSingleton() { if(_Singleton==null) { _Singleton=newSingleton(); } return_Singleton; } }
注:为什么说是不安全的单例,多线程访问时可能会new多个对象...
第二种方式创建单例:
///<summary> ///(多线程)安全单例 ///</summary> publicsealedclassSingleton { privatestaticSingleton_Singleton; privatestaticreadonlyobjectobj=newobject(); privateSingleton(){} publicstaticSingletonGetSingleton() { if(_Singleton==null) { //加锁保护,在多线程下可以确保实例值被创建一次。缺点是每次获取单例,都要进行判断,涉及到的锁和解锁比较耗资源。 lock(obj) { if(_Singleton==null) { _Singleton=newSingleton(); } } } return_Singleton; } }
注:为了解决上面第一种方式创建的不安全实例问题应用而生。
第三种方式创建单例:
///<summary> ///只读单例 ///</summary> publicsealedclassSingleton { privatestaticreadonlySingletoninstance=newSingleton(); privateSingleton(){} publicstaticSingletonInstance { get { returninstance; } } }
///<summary> ///基于上面的只读单例=自动属性只读单例(语法糖) ///</summary> publicsealedclassSingleton { privateSingleton(){} publicstaticSingletonInstance{get;}=newSingleton(); }
注:只读属性式=>借助readonly属性,instance只被初始化一次,同样达到了单例的效果。在引用函数执行第一句话之前,instance其实已经被赋值了,并不是预期的 只有到访问Instance变量时才创建对象。
第四种方式创建单例:
///<summary> ///Singleton中加上静态构造函数。 ///</summary> publicsealedclassSingleton { publicstaticreadonlySingletoninstance=newSingleton(); privateSingleton() { Console.WriteLine("初始化1!"); } staticSingleton() { } publicstaticSingletonInstance { get{returninstance;} } }
注:为了解决(第三种只读属性实例)在执行第一句代码之前,实例已经被初始化问题。
第五种方式创建单例:
///<summary> ///使用Lazy创建单例,默认是线程安全的 ///</summary> publicsealedclassSingleton { privatestaticreadonlyLazy<Singleton>instance=newLazy<Singleton>(()=>newSingleton());// privateSingleton(){} publicstaticSingletonInstance { get { returninstance.Value; } } }
//贴一下关于上面Lazy<T>s=newLazy<T>()参数的定义; //摘要: //初始化System.Lazy`1类的新实例。懒惰初始化时 //发生时,使用指定的初始化函数和初始化模式。 //参数: //valueFactory: //被调用以生成延迟初始化值的委托是必需的参数 // //isThreadSafe: //如果要使此实例可由多个线程同时使用,则为true;false //使此实例一次只能由一个线程使用。 publicLazy(Func<T>valueFactory,boolisThreadSafe);
上述就是小编为大家分享的在C#中创建单例的方法有哪些了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
在Python中,将K添加到列元组列表中的最小元素
处理数据集涉及识别特定列中的最小值并通过添加常量值(K)来更新它。通过实施优化的解决方案,我们可以有效地执行此操作,这对于数据...
-
使用switch case语句编写的C程序,用于计算几何图形的面积
#includevoidmain(){intfig_code;floatside,base,length,...
-
如何使 C# 代码可重用?
要在C#中使代码可重用,请使用接口。接口定义属性、方法和事件,这些成员是接口的成员。接口只包含成员的声明。派生类负责定义成员。这通...
-
C# 中的覆盖和隐藏有什么区别?
方法隐藏在C#中也称为隐藏。父类的方法可供子类使用,无需在遮蔽中使用override关键字。子类有其自己版本的相同函数。在...
-
在Java中使用示例双倍longValue()函数
Java是一种强大的面向对象语言,可以对各种数据类型进行高度的控制和精确度。其中一种功能是doublelongValue(),...
-
如何在Java中定义JSON字段名称的命名约定?
TheFieldNamingPolicycanbeusedtodefineafewstandardnaming...
-
Servlet中的HttpSession接口
在JavaWeb开发领域,了解HttpSession接口是创建动态和响应式Web应用程序的关键。在本文中,我们将探讨...
-
使用while循环查找自然数之和的Java程序
自然数之和可以使用编程语言中的不同迭代语句来计算。迭代语句是执行一组特定代码行直到循环语句中的条件失败的语句。在本文中,我们将讨论...
-
我们可以将Java数组转换为列表吗?
我们可以使用Arrays.asList()方法轻松地将Java数组转换为List。语法publicstaticLi...
-
Java中如何在不使用任何外部库的情况下读取网页内容?
TheURLclassofthejava.netpackagerepresentsaUniformResour...