推荐使用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
# 可选
# 序列化
# 的是
# 加载
# 首次
# 设为
# 推荐使用
# 两次
# 适用于
相关文章:
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何在搬瓦工VPS快速搭建网站?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
平台云上自助建站如何快速打造专业网站?
建站之星2.7模板快速切换与批量管理功能操作指南
如何通过服务器快速搭建网站?完整步骤解析
如何注册花生壳免费域名并搭建个人网站?
如何在IIS中新建站点并解决端口绑定冲突?
常州自助建站工具推荐:低成本搭建与模板选择技巧
网站制作公司,橙子建站是合法的吗?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何用好域名打造高点击率的自主建站?
怎么将XML数据可视化 D3.js加载XML
建站之星如何优化SEO以实现高效排名?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
广州营销型建站服务商推荐:技术优势与SEO优化解析
,怎么在广州志愿者网站注册?
如何确保西部建站助手FTP传输的安全性?
如何通过wdcp面板快速创建网站?
网站制作壁纸教程视频,电脑壁纸网站?
公众号网站制作网页,微信公众号怎么制作?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星免费版是否永久可用?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何配置WinSCP新建站点的密钥验证步骤?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
如何高效完成自助建站业务培训?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何用y主机助手快速搭建网站?
如何通过WDCP绑定主域名及创建子域名站点?
如何快速搭建虚拟主机网站?新手必看指南
建站org新手必看:2024最新搭建流程与模板选择技巧
简历在线制作网站免费,免费下载个人简历的网站是哪些?
建站之星如何一键生成手机站?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
建站为何优先选择香港服务器?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何在云服务器上快速搭建个人网站?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
如何高效搭建专业期货交易平台网站?
如何用低价快速搭建高质量网站?
网站制作服务平台,有什么网站可以发布本地服务信息?
活动邀请函制作网站有哪些,活动邀请函文案?
Python文件管理规范_工程实践说明【指导】
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
如何在腾讯云免费申请建站?
*请认真填写需求信息,我们会在24小时内与您取得联系。