在 C# 里如何实现单例模式?

作者 陈计节 发布于 433 次浏览 讨论

群友发起了 C# 里实现单例模式的讨论,希望了解更简便的单例创建方法。

最后,讨论到如何在团队中推广编码规范。

共有 39 条回复
致我们初中的班长

为什么C# 语法特性 单例特性没有比较优雅的写法

三生石畔我独怜

单例?Lazy啊

致我们初中的班长

比如用single关键字 就是创建一个单例

致我们初中的班长

picture-1576722372268

致我们初中的班长

这种写法很不爽啊 太原始了

三生石畔我独怜

你去看看Lazy<T>

致我们初中的班长

好的 谢谢大佬

三生石畔我独怜

用关键词就太奢侈了 创建单例的姿势太多了

鬼知道你要哪种姿势

致我们初中的班长

我只想最好用一行代码就能实现的版本

致我们初中的班长

这个就是

致我们初中的班长

目前程序没有做成多线程的 可能不太需要吧 还在研究中 这个是api提供的核心内部对象

只是找到的demo把他做成了单例 后面看能否取掉

三生石畔我独怜

没有多线程 单例还不随便写 至于用双重锁吗

以你为荣

想用一行实现单例 static 构造函数

致我们初中的班长

lazy没搞明白

不对class 做任何限制 保证不了吧

素衣清颜淡若尘

.NET 实现singleton我记得有6个版本的演化。。。

lazy是最新的方式

https://csharpindepth.com/Articles/Singleton 这篇清真文章总结过

黑白灰

双重写法也不是100%的单例

三生石畔我独怜

啥意思

致我们初中的班长

这是单线程版本 但是还是得堵死构造函数吧

致我们初中的班长

picture-1576722372321

致我们初中的班长

否则,人家不用你这个方法创建不是 没用 所以构造方法有且仅有一个private声明的是必要的把

跟这第一个例子一样

致我们初中的班长

picture-1576722372257

致我们初中的班长

但是用属性不太好吧 讨厌属性里面get逻辑

调用没有方法舒服

三生石畔我独怜

这个逻辑很简单和常见

属性就是方法 所以这只是你的编程习惯而言啊

致我们初中的班长

不是说lazy可以一行代码啊

不是说好的lazy可以一行实现单例吗

三生石畔我独怜

我几年前就写了篇一半翻译一半融入个人理解的文章

单例模式小结 - 叶影的文章 - 知乎 https://zhuanlan.zhihu.com/p/29723536

致我们初中的班长

如果用了lazy得到的实例 别人构造函数还得做限制吧

三生石畔我独怜

picture-1576722372207

致我们初中的班长

否则直接实例化了

用new

三生石畔我独怜

它有很多重载啊

你想到的微软大佬们还想不到?

可以允许你传入一个工厂方法

致我们初中的班长

多线程也可以的把

好像代码清真很多

三生石畔我独怜

没有银弹 Lazy也有它的限制

多用用就熟悉了

很多时候直接static定义而非延迟加载就完事了

致我们初中的班长

@C#之星 为啥要用sealed啊

三生石畔我独怜

习惯如此 理由一般有两个:一是这个类我明确不想让别人继承,设计如此;一个是作为某基类的子类,感觉将来被继承的可能性不大,就先密封起来,为将来编译器对callvirt的优化提供可能。

素衣清颜淡若尘

去看.net框架设计规范,契约,模式

有一本书的

大二时候看过

教你怎么设计不坑人的API

就讲这些知识

致我们初中的班长

嗯 谢谢

专门写规范的书 不多见啊

致我们初中的班长

picture-1576722372260

致我们初中的班长

我从一开始写代码 都是自己一点点建立起来的个人规范 这本书可以给企业推广啊

形成统一规范

素衣清颜淡若尘

特别推荐

清真得不得了

AllenXu

确实应该强推 .Net 设计规范