泛型类的静态成员

发布时间 2023-09-05 15:11:10作者: dewxin

简介

想对单例进行统一的管理,在UnityEditor进入playMode的时候,手动清空一些单例。
于是网上搜到了一个单例的写法,但是对其中的static字段产生的疑问。

令人产生疑问的代码

public class Singleton<T> 
    where T: Singleton<T>, new() 
{

    private static T _instance;

    public static T Instance 
    { 
        get 
        {
            if(_instance == null )
            {
                _instance= new T();
            }
            return _instance; 
        }
    }


}

这个代码令人奇怪的地方是,static是静态字段,泛型类传入type参数后,居然能够访问不同类的单例。比如 Singleton.Instance返回的是Class1类,Singleton.Instance返回的是Student类。

解释

C#中的泛型类(open)相当于一个蓝图,会根据填入的type参数,生成一个新的泛型类(closed),Singleton和Sington是两个不同的类,两个类中各自有一个和自己的类绑定的static字段。
这点和java是不同的。

参考

Unity监听PlayMode

stackoverflow上的讨论