c#单例

博客围绕 C# 展开,重点提及单例模式。单例模式是程序设计中的重要概念,在 C# 里有其特定应用与实现方式,能帮助开发者更好地管理资源和控制对象创建。
 static readonly System.Object lockThis = new object();
        private static Biz _Instance;
        public static Biz Instance
        {
            get
            {
                if (_Instance == null)
                    lock (lockThis)
                    {
                        if (_Instance == null)
                            _Instance = new Biz ();
                    }
                return _Instance;
            }
        }
### C# 单例模式的实现与使用 #### 概述 单例模式是一种常用的设计模式,它确保某一个类只有一个实,并提供全局访问点。在 C# 中,可以通过多种方式实现单例模式,每种方式都有其适用场景和优劣之处。 --- #### 方法一:懒汉式单例模式 懒汉式单例模式会在第一次调用时才创建实,延迟加载可以节省内存资源。 ```csharp public sealed class SingletonLazy { private static SingletonLazy instance = null; private static readonly object padlock = new object(); private SingletonLazy() { // 私有构造函数防止外部实化 } public static SingletonLazy Instance { get { if (instance == null) // 第一次检查 { lock (padlock) // 加锁确保线程安全 { if (instance == null) // 第二次检查 { instance = new SingletonLazy(); } } } return instance; } } } ``` 这种方法称为双重检查锁定(Double-Checked Locking),适合于多线程环境[^1]。 --- #### 方法二:饿汉式单例模式 饿汉式单例模式会在类加载时就立即创建实,这种方式简高效,但由于提前创建实可能浪费资源。 ```csharp public sealed class SingletonEager { private static readonly SingletonEager instance = new SingletonEager(); private SingletonEager() { // 私有构造函数防止外部实化 } public static SingletonEager Instance { get { return instance; } } } ``` 由于实是在静态字段中定义的,CLR 会保证其线程安全性[^2]。 --- #### 方法三:基于 `Lazy<T>` 的单例模式 C# 提供了内置的 `Lazy<T>` 类,它可以简化懒加载逻辑,同时保持线程安全。 ```csharp using System; public sealed class SingletonWithLazy { private static readonly Lazy<SingletonWithLazy> lazyInstance = new Lazy<SingletonWithLazy>(() => new SingletonWithLazy()); private SingletonWithLazy() { // 私有构造函数防止外部实化 } public static SingletonWithLazy Instance { get { return lazyInstance.Value; } } } ``` `Lazy<T>` 自动处理了线程同步问题,推荐在现代开发中使用[^1]。 --- #### 方法四:继承式的单例模式 通过抽象基类的方式实现单例模式,子类只需继承即可获得行为。 ```csharp public abstract class SingletonBase<T> where T : new() { private static T _instance; private static readonly object Mutex = new object(); public static T Instance { get { if (_instance == null) { lock (Mutex) { if (_instance == null) { _instance = new T(); } } } return _instance; } } } public class ConcreteSingleton : SingletonBase<ConcreteSingleton> { public void PerformAction() { Console.WriteLine("执行动作"); } } // 使用示 var singleton = ConcreteSingleton.Instance; singleton.PerformAction(); ``` 该方法的优点是可以复用代码,缺点是子类不能再继承其他类。 --- #### 应用场景 1. **配置管理**:当应用程序需要统一管理和分发配置参数时,单例模式非常适合。 2. **日志记录**:为了集中控制日志输出,通常将日志管理器设计为。 3. **数据库连接池**:避免频繁建立和销毁数据库连接,提高性能。 4. **缓存服务**:维护全局共享的数据缓存,减少冗余计算。 --- #### 注意事项 - 如果对象持有大量状态或占用较多资源,应考虑如何释放这些资源。 - 在分布式系统中,单例模式不适用于跨进程或多服务器的情况。 - 尽量避免滥用单例模式,因为它可能导致代码耦合度增加,降低可测试性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值