全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C#怎么实现单例模式 C#设计模式之单例实现方法

推荐使用Lazy实现单例模式,线程安全且支持延迟初始化;其次可选静态构造函数方式(非延迟);DCL仅用于旧框架兼容。需注意避免滥用、优先考虑DI容器替代。

在C#中实现单例模式,核心是确保一个类只有一个实例,并提供全局访问点。最常用、最推荐的是静态构造函数 + 私有静态只读字段方式(线程安全、简洁、延迟初始化),.NET 4+ 也常用 Lazy 实现。

懒加载 + Lazy(推荐,线程安全且简洁)

利用 .NET 内置的 Lazy 类,天然支持线程安全的延迟初始化,代码清晰易懂:

  • 声明私有静态只读 Lazy 字段
  • 通过属性暴露唯一实例(Value 触发首次创建)
  • 构造函数设为 private,防止外部 new
示例:
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小时内与您取得联系。