推荐使用Lazy实现单例模式,线程安全且支持延迟初始化;其次可选静态构造函数方式(非延迟);DCL仅用于旧框架兼容。需注意避免滥用、优先考虑DI容器替代。
在C#中实现单例模式,核心是确保一个类只有一个实例,并提供全局访问点。最常用、最推荐的是静态构造函数 + 私有静态只读字段方式(线程安全、简洁、延迟初始化),.NET 4+ 也常用 Lazy
利用 .NET 内置的 Lazy 类,天然支持线程安全的延迟初始化,代码清晰易懂:
Lazy 字段Value 触发首次创建)public sealed class Singleton
{
private static readonly Lazy _instance = new Lazy(() => new Singleton());
public static Singleton Instance => _instance.Value;
private Singleton() { } // 禁止外部实例化}
静态构造函数方式(线程安全,但非延迟加载)
利用 C# 静态构造函数的线程安全特性自动初始化,但会在第一次访问该类型时就创建实例(可能早于实际需要):
- 私有静态字段直接 new 实例
- 静态构造函数可省略(若无需额外逻辑),或显式定义以强调初始化时机
- 同样需 private 构造函数
示例:public sealed class Singleton
{
private static readonly Singleton _instance = new Singleton();
static Singleton() { } // 可选:确保类型初始化时执行
public static Singleton Instance => _instance;
private Singleton() { }}
双重检查锁定(DCL)——兼容旧框架,但不推荐新项目
适用于需严格控制初始化时机且不能用 Lazy 的场景(如 .NET Framework 3.5),但代码较复杂,易出错:
- 需
volatile 修饰实例字段,防止指令重排
- 两次判空 + lock,保证仅一次初始化
- 注意 lock 对象必须是私有静态对象,不可用
this 或类型本身
示例(仅作了解):public sealed class Singleton
{
private static volatile Singleton _instance;
private static readonly object _lock = new object();
public static Singleton Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}
private Singleton() { }}
注意事项与建议
单例不是万能的,使用前请确认是否真有必要:
- 避免滥用:频繁依赖单例会增加耦合,不利于单元测试和依赖注入
- 考虑替代方案:现代 C# 项目更推荐用 DI 容器(如 Microsoft.Extensions.DependencyInjection)注册为 Singleton 生命周期
- 序列化/反序列化时需处理:若支持序列化,应实现
IDeserializationCallback 或标记 [Serializable] 并重写 GetObjectData
- 继承限制:单例类通常应为
sealed,防止子类破坏唯一性
基本上就这些。对绝大多数 C# 新项目,用 Lazy 是最稳妥、干净的选择。
# 懒加载
# microsoft
# c#
# 延迟加载
# .net
# 子类
# 构造函数
# volatile
# 继承
# private
# 线程
# 对象
# this
# 可选
# 序列化
# 的是
# 加载
# 首次
# 设为
# 推荐使用
# 两次
# 适用于
相关文章:
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
如何快速搭建二级域名独立网站?
建站之星后台密码遗忘或太弱?如何重置与强化?
如何在西部数码注册域名并快速搭建网站?
如何选择网络建站服务器?高效建站必看指南
如何通过主机屋免费建站教程十分钟搭建网站?
建站之星图片链接生成指南:自助建站与智能设计教程
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
html制作网站的步骤有哪些,iapp如何添加网页?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
企业微网站怎么做,公司网站和公众号有什么区别?
创业网站制作流程,创业网站可靠吗?
如何通过二级域名建站提升品牌影响力?
如何在建站宝盒中设置产品搜索功能?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何在云服务器上快速搭建个人网站?
如何在建站之星网店版论坛获取技术支持?
建站主机无法访问?如何排查域名与服务器问题
建站之星安装失败:服务器环境不兼容?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
建站主机如何选?性能与价格怎样平衡?
建站上传速度慢?如何优化加速网站加载效率?
学校为何禁止电信移动建设网站?
如何通过建站之星自助学习解决操作问题?
网站制作需要会哪些技术,建立一个网站要花费多少?
建站之星客服服务时间及联系方式如何?
高防服务器租用如何选择配置与防御等级?
,怎么在广州志愿者网站注册?
建站之星安装路径如何正确选择及配置?
如何解决ASP生成WAP建站中文乱码问题?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
建站之星安装需要哪些步骤及注意事项?
如何登录建站主机?访问步骤全解析
智能起名网站制作软件有哪些,制作logo的软件?
如何通过.red域名打造高辨识度品牌网站?
外贸公司网站制作哪家好,maersk船公司官网?
建站主机选哪家性价比最高?
如何快速搭建高效简练网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何通过远程VPS快速搭建个人网站?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
Android滚轮选择时间控件使用详解
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
,购物网站怎么盈利呢?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
重庆市网站制作公司,重庆招聘网站哪个好?
*请认真填写需求信息,我们会在24小时内与您取得联系。