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

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

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