了解了单例模式后,怎么简洁好用的写C#单例与Unity中MonoBehaviour单例呢?
静态构造函数实现单例
在引用任何静态成员之前,由.NET自动调用静态构造函数。
public class Singleton
{
private static Singleton _instance = null;
public static Singleton Instance
{
get{
return _instance;
}
}
// 静态构造函数实现单例,在引用任何静态成员之前,由.NET自动调用静态构造函数
// 参考阅读 https://www.cnblogs.com/zh7791/p/7930342.html
static Singleton(){
_instance = new Singleton();
}
}
静态属性声明时赋值实现单例
这种本质跟上一种是相同道理,只不过是.NET自动创建静态构造函数为Instance赋值。
public class Singleton
{
// 静态属性声明时赋值,.NET自动创建静态构造函数为Instance赋值
public static Singleton Instance { get; } = new Singleton();
private Singleton()
{
// 将自定义构造函数代码放在这里
}
}
MonoBehaviour单例不用手动挂脚本
using UnityEngine;
public class Singleton : MonoBehaviour
{
private static Singleton _instance = null;
public static Singleton Instance
{
get
{
if (_instance == null)
{
GameObject go = new GameObject("Singleton");
_instance = go.AddComponent<Singleton>();
}
return _instance;
}
}
}
MonoBehaviour单例DontDestroyOnLoad
using UnityEngine;
public class Singleton : MonoBehaviour
{
public bool DontDestroy = true;
private static Singleton _instance = null;
public static Singleton Ins => _instance;
// DontDestroy情况下,加载场景时Awake会执行
private void Awake()
{
// 注意&与&&区别
if (_instance != null & _instance == this)
return;
_instance = this;
if(_instance.DontDestroy) DontDestroyOnLoad(gameObject);
}
}