为什么

unity重写了==null,不管C#层或C++层对象被销毁都是true。?.则只能判断C#层是不是null,使用则对象被销毁后还是会执行。
cs
public class Null传播测试:MonoBehaviour
{
private void Start()
{
StartCoroutine(DO());
}
IEnumerator DO()
{
GameObject go = new GameObject("和");
Destroy(go);
yield return null;
go?.transform.Translate(Vector3.left);
}
}
怎么办
想用?.因为这个对象访问链很长,多写一遍加很多代码。
那么如果因为访问链代码长,可以弄全局访问点,让if代码量可接受。
对Object扩展方法?
cs
public static class TryDoExt
{
public static void Try(this UnityEngine.Object obj,
Action action)
{
if (obj != null)
{
action?.Invoke();
}
}
}
发现很长的访问链要写2遍,比if根本没有优势。
要么把目标类的方法封装扩展方法,那么n个方法要封装n个扩展方法。
思考
一个对象,被两个变量引用着,然后Destroy它的go,假如变量引用的是地址,那两个变量不知道自己引用的对象已经被销毁了,在C#里
cs
public class Null传播测试 : MonoBehaviour
{
private void Start()
{
StartCoroutine(DO());
}
IEnumerator DO()
{
GameObject go = new GameObject("和");
Destroy(go);
yield return null;
//go?.transform.Translate(Vector3.left);
Debug.Log(ReferenceEquals(go, null));
}
}

并不知道那个对象被销毁。在C#里销毁对象是把所有引用=null后由垃圾回收。在Unity里是通过判断原生C++对象为null知道已销毁。
那么我们好像能明白C++复杂在哪里了。一个对象,x个变量在引用它,哪里都不敢delete,不知道别人用完没有。那么还是要把对象池化管理,引用计数。