当前位置: 首页> 房产> 建筑 > Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化

Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化

时间:2025/7/31 20:17:30来源:https://blog.csdn.net/m0_62135731/article/details/140726166 浏览次数:1次

      如果某些字段在每个构造函数中都要进行初始化,很多人都喜欢在字段声明时就进行初始化,对于一个非继承自MonoBehaviour的脚步,这样做是没有问题的,然而继承自MonoBehaviour后就会造成内存的浪费,为什么呢?因为继承自MonoBehaviour的脚步的构造函数可能会被多次执行,这也是为什么Unity的Mono脚步不使用构造函数的原因。而字段在声明时赋值的结果其实是会在构造函数中去执行,即使没有声明构造函数,编译器会在默认的无参构造函数中将你的字段初始化放到默认的构造函数中去。下面用一个简单的脚步进行看一下:

    public class Test : MonoBehaviour{private List<int> _data = new List<int>();public Test(){Debug.Log("构造函数调用 -- Test");}void Start(){}}

上面这段代码就是在声明字段时就进行了初始化,现在从IL代码层面上去看一下:

.class public auto ansi beforefieldinit MagicWorld.Testextends [UnityEngine.CoreModule]UnityEngine.MonoBehaviour
{// Fields.field private class [netstandard]System.Collections.Generic.List`1<int32> _data// Methods.method public hidebysig specialname rtspecialname instance void .ctor () cil managed {// Method begins at RVA 0x3639// Header size: 1// Code size: 28 (0x1c).maxstack 8IL_0000: ldarg.0IL_0001: newobj instance void class [netstandard]System.Collections.Generic.List`1<int32>::.ctor()  // _data = new List<int>();IL_0006: stfld class [netstandard]System.Collections.Generic.List`1<int32> MagicWorld.Test::_dataIL_000b: ldarg.0IL_000c: call instance void [UnityEngine.CoreModule]UnityEngine.MonoBehaviour::.ctor()IL_0011: ldstr "构造函数调用 -- Test"IL_0016: call void [UnityEngine.CoreModule]UnityEngine.Debug::Log(object)IL_001b: ret} // end of method Test::.ctor.method private hidebysig instance void Start () cil managed {// Method begins at RVA 0x3656// Header size: 1// Code size: 1 (0x1).maxstack 8IL_0000: ret} // end of method Test::Start} // end of class MagicWorld.Test

如果没有无参构造函数,有很多构造函数的话,上面的代码会被写到指向父类的构造函数的那个构造函数中,即:base()。

       如果是静态字段在声明时直接赋值则会在静态构造函数中执行。 而静态构造函数会在程序集加载时由编译器负责调用。

       因此,建议对于Mono脚本,初始化操作建议放到Awake或Start中去执行。在编辑器模式下挂载脚步也是会执行脚步的构造函数的。对于静态变量建议执行懒初始化,即访问时为null时才执行初始化,或者使用C#的Lazy<T>类来完成懒初始化。

        至少到目前Unity支持的C#9语法来看都是这样的,以后就不清楚了。 

关键字:Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: