C#实现单例模式
单例模式是一种创建型设计模式,该模式保证某个类只有一个实例,并提供一个全局访问点来访问这个实例。这个模式的目的是确保该类始终都只能有一个对象被创建和访问,并且在应用程序的整个生命周期中使用这个对象。
单例模式通常用于控制资源的访问权限,例如文件系统、数据库连接等,以保证在整个应用程序中只会有一个实例被创建并被共享。
单例模式的优缺点如下:
优点:
- 保证了系统内部对象的唯一性;
- 全局统一的访问方式,便于使用和管理;
- 由于只有一个实例,因此可以节约系统资源,减少资源占用。
不完全懒汉式,但不加锁的线程安全
public sealed class Oneins
{
private static readonly Oneins instance = new Oneins();
/// <summary>
/// 显式的静态构造函数用来告诉C#编译器在其内容实例化之前不要标记其类型
/// </summary>
static Oneins() { }
private Oneins() { }
public static Oneins Instance
{
get
{
return instance;
}
}
}
以上代码实现了单例模式的一个版本,下面是解释:
sealed 关键字用于表示该类是密封的,不能被其他的类继承。
private static readonly 关键字用于声明私有、静态和只读字段 instance ,并将其初始化为该类的唯一实例,这个实例会在程序启动时进行初始化,因此是线程安全的。
static Oneins() 是一个显式的静态构造函数,它用来告诉C#编译器在实例化之前不要标记其类型。这个构造函数在静态实例实例化前仅调用一次,即使没有使用该类方法或属性也会自动执行(因为所有的成员都是静态的)。它确保只有当你第一次使用实例时,实例才会创建。
private Oneins() 是私有的不带参数构造函数,禁止外部类实例化该类对象,从而限制本类实例化的个数为1。
最后,通过公共的 Instance 属性来获得该类的唯一实例,使用时不需要传入任何参数,只需要调用该属性即可返回类实例。这个属性实际是一个只读(getter)属性,它返回 instance 静态字段。由于 instance 字段是私有的,所以只能通过属性来访问该实例。
这是一个线程安全且简单的单例模式实现,但是它存在一个问题即无论是否被引用都会在程序启动时就初始化。如果该实例非常消耗资源,将浪费系统资源。
使用.NET 4 Lazy<T> type 特性,实现完全懒汉实例化
public sealed class Oneins
{
private static readonly Lazy<Oneins> lazy =
new Lazy<Oneins>(()=> new Oneins());
public static Oneins Instance { get { return lazy.Value; } }
private Oneins() { }
}
使用.NET 4或其以上版本,可以使用System.Lazy<T> type来实现完全懒汉式。其代码看起来也很简洁且性能表现也很好。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!