新闻中心

C#如何实现单例模式 C#设计模式之单例模式的几种写法

2025-11-07
浏览次数:
返回列表
单例模式确保类唯一实例,C#中常用实现包括:简单非线程安全、双重检查锁定、静态构造函数、嵌套类延迟加载及Lazy方式;其中Lazy因线程安全、延迟加载且简洁,为现代推荐写法。

c#如何实现单例模式 c#设计模式之单例模式的几种写法

单例模式确保一个类只有一个实例,并提供一个全局访问点。在C#中,有多种实现方式,各有优缺点,适用于不同场景。以下是几种常见的写法。

1. 简单单线程版本(不推荐用于多线程)

这种写法最简单,但在多线程环境下可能创建多个实例,不安全。

public class Singleton
{
    private static Singleton instance;
<pre class='brush:php;toolbar:false;'>private Singleton() { }

public static Singleton Instance
{
    get
    {
        if (instance == null)
        {
            instance = new Singleton();
        }
        return instance;
    }
}

}

php 配置文件php.ini的中文注释版(09.4) php 配置文件php.ini的中文注释版(09.4)

在WINDOWS下,编译时的路径是WINDOWS安装目录。 ; 在命令行模式下,PHP.INI的查找路径可以用 -C 参数替代。 ; 该文件的语法非常简单。空白字符和用分号&ACUTE;;&ACUTE;开始的行被简单地忽略(就象你可能 ; 猜到的一样)。 章节标题(例如 : [FOO])也被简单地忽略,即使将来它们可能 ; 有某种的意义。 ; ;

php 配置文件php.ini的中文注释版(09.4) 449 查看详情 php 配置文件php.ini的中文注释版(09.4)

说明:构造函数私有,通过静态属性获取唯一实例。但多线程同时调用时,可能多次进入if判断,导致重复创建。

2. 线程安全的双重检查锁定(常用推荐)

使用锁机制和双重检查,既保证线程安全,又提升性能。

public class Singleton
{
    private static volatile Singleton instance;
    private static readonly object lockObject = new object();
<pre class='brush:php;toolbar:false;'>private Singleton() { }

public static Singleton Instance
{
    get
    {
        if (instance == null)
        {
            lock (lockObject)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

}

说明:volatile防止指令重排序,lock确保同一时间只有一个线程能创建实例,双重if减少锁竞争。

3. 静态构造函数方式(CLR保证线程安全)

利用C#静态构造函数只执行一次的特性,实现简洁且线程安全的单例。

public class Singleton
{
    private static readonly Singleton instance = new Singleton();
<pre class='brush:php;toolbar:false;'>static Singleton() { }

private Singleton() { }

public static Singleton Instance => instance;

}

说明:静态字段初始化在静态构造函数中执行,.NET运行时保证其线程安全,代码简洁,延迟初始化无法控制(在首次访问类成员时即初始化)。

4. 嵌套类实现延迟加载(推荐)

通过嵌套私有类实现真正的延迟加载,且线程安全。

public class Singleton
{
    private Singleton() { }
<pre class='brush:php;toolbar:false;'>public static Singleton Instance => Nested.instance;

private class Nested
{
    static Nested() { }
    internal static readonly Singleton instance = new Singleton();
}

}

说明:嵌套类的静态成员只在第一次访问时初始化,.NET自动处理线程安全,实现延迟加载,是兼顾性能与安全的好方法。

5. 使用Lazy(现代推荐写法)

C# 4.0引入的Lazy类型,专为延迟初始化设计。

public class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());
<pre class='brush:php;toolbar:false;'>private Singleton() { }

public static Singleton Instance => lazy.Value;

}

说明:Lazy默认线程安全,支持多种初始化模式,代码清晰,易于维护,是当前最推荐的方式。

基本上就这些常见写法。选择哪种取决于是否需要延迟加载、性能要求以及框架版本。对于新项目,优先考虑Lazy方式。

以上就是C#如何实现单例模式 C#设计模式之单例模式的几种写法的详细内容,更多请关注其它相关文章!


# 什么用  # 网站优化与推广论文  # 商家排名规则seo  # 网站顶部区如何优化  # 青岛网站建设官网推荐  # 陈村狮山网站建设  # 策划营销推广文案模板  # 营销网站建设业务  # 沈阳营销推广获客系统  # 兼职推广app网站大全  # 薯条营销推广在哪里接单  # 扁平化  # 单例模式  # 如何使用  # 表单  # 只有一个  # 如何实现  # 配置文件  # 几种  # 多线程  # 加载  # .net  # 延迟加载  # c# 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 在Go Martini框架中高效服务动态生成图像的实践指南  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  C++如何解决segmentation fault_C++段错误调试与原因分析  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  德邦快递查询平台 德邦快递物流信息查询入口  离线运行Go语言之旅:本地部署与GOPATH配置指南  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  狙击外星人小游戏开始_狙击外星人小游戏立即开始  大象笔记网页版入口 印象笔记网页版登录入口  163邮箱官方主页登录 直达网易邮箱登录核心页面  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  J*aScript map 方法中处理循环元素为空数组的策略  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  163邮箱登录密码 163邮箱忘记密码找回  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  深入理解J*aScript Promise异步执行与微任务队列  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  抖音网页版平台入口 抖音网页版官网在线访问教程  探索高级语言到原生C/C++的转译:挑战与内存管理策略  顺丰快递查询系统 官方正版查询入口  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  深入理解J*a编译器的兼容性选项:从-source到--release  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  J*aScript:在map操作中高效处理空数组  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  React Hooks最佳实践:动态组件状态管理的组件化方案  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  12306选座如何查看座位示意图_12306座位示意图解读与使用  b站赚钱渠道_b站收益来源  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  外媒分析《GTA6》定价:卖100美元可以但真没必要! 

搜索