C#之单例写法

非继承MonoBehaviour单例

    public abstract class Singleton<T> where T : new() {
        private static T _instance;
        private static readonly object locker = new object();

        public static T Ins {
            get {
                if(_instance == null) {
                    lock(locker) {
                        if(_instance == null) {
                            _instance = new T();
                        }
                    }
                }
                return _instance;
            }
            private set { }
        }
    }

继承MonoBehaviour单例

public class PathHelper : MonoBehaviour {
    private static PathHelper _instance = null;
    private PathHelper() { }
    public static PathHelper Ins {
        get {
            return _instance;
        }
        private set {}
    }

    void Awake() {
        if(_instance != null) {
            DestroyImmediate(gameObject);
        } else {
            _instance = this;
        }
        DontDestroyOnLoad(gameObject);
    }
}
C# 中实现模式时,优雅性通常体现在代码的简洁性、线程安全性以及延迟初始化的能力。以下是几种推荐的方式: ### 使用 `Lazy<T>` 实现线程安全的延迟初始化 .NET 4 及以上版本引入了 `System.Lazy<T>` 类型,它提供了一种简且线程安全的方式来实现延迟初始化。这种方式不仅代码简洁,而且默认是线程安全的。 ```csharp public sealed class Singleton { private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton()); public static Singleton Instance { get { return lazy.Value; } } private Singleton() { // 初始化逻辑 } } ``` 该方法利用了 `Lazy<T>` 的惰性求值特性,在第一次访问 `Instance` 属性时才创建实,并确保多线程环境下只创建一次[^3]。 ### 使用静态构造函数确保线程安全 另一种方式是通过静态构造函数来初始化实。CLR 会自动保证静态构造函数只执行一次,因此这种方式天然具备线程安全性。 ```csharp public sealed class Singleton { public static readonly Singleton Instance = new Singleton(); static Singleton() { // 静态构造函数用于触发实化 } private Singleton() { // 初始化逻辑 } } ``` 这种方式虽然不是延迟加载(实会在类首次被引用时创建),但其优点在于实现非常简洁并且线程安全。 ### 枚举实现模式(适用于特定场景) 如果希望获得序列化和线程安全的保障,同时不介意使用枚举类型,可以通过枚举实现模式。这种方式尤其适合资源管理或全局状态维护的场景。 ```csharp public enum SomeThing { INSTANCE; private Resource instance; SomeThing() { instance = new Resource(); } public Resource GetInstance() { return instance; } } public class Resource { // 资源相关逻辑 } ``` 枚举实由 JVM(或 .NET 运行时)保证其唯一性和线程安全,因此非常适合用来实现模式[^1]。 ### 使用锁机制手动控制线程安全 如果不使用 `Lazy<T>` 或者需要更细粒度的控制,可以使用 `lock` 关键字结合双重检查锁定来实现线程安全的模式。 ```csharp public sealed class Singleton { private static Singleton instance = null; private static readonly object padlock = new object(); private Singleton() { // 初始化逻辑 } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (instance == null) { instance = new Singleton(); } } } return instance; } } } ``` 这种方法虽然实现较为复杂,但在某些需要自定义同步策略的场景下仍然适用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值