在C#中创建单例的方法有哪些

这期内容当中小编将会给大家带来有关在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#中创建单例的方法有哪些了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2021-03-13 15:40:57
收藏
分享
海报
0 条评论
173
上一篇:弹性布局flex的基本应用示例 下一篇:如何在python中使用openpyxl实现带格式复制表格
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码