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

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

群友发起了 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 设计规范