⼀.值类型的变量直接存储数据,⽽引⽤类型的变量持有的是数据的引⽤,数据存储在数据堆中。
值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。
引⽤类型(reference type):string 和 class统称为引⽤类型。当声明⼀个类时,只在栈中分配⼀⼩⽚内存⽤于容纳⼀个地址,⽽此时并没有为其分配堆上的内存空间。当使⽤ new 创建⼀个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的⼩⽚空间中。值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引⽤类型的对象总是在进程堆中分配(动态分配)。
不同点:
1)范围⽅⾯ C#的值类型包括:结构体(数值类型、bool型、⽤户定义的结构体),枚举,可空类型。C#的引⽤类型包括:数组,⽤户定义的类、接⼝、委托,object,字符串。
2)内存分配⽅⾯ 数组的元素不管是引⽤类型还是值类型,都存储在托管堆上。【注意:托管堆和进程堆,是⼀种么?另外:线程堆栈(Thread Stack)和托管堆(Managed Heap),⽇后会再单独涉及】 引⽤类型在栈中存储⼀个引⽤,其实际的存储位置位于托管堆。简称引⽤类型部署在托管推上。⽽值类型总是分配在它声明的地⽅:作为字段时,跟随其所属的变量(实 例)存储;作为局部变量时,存储在栈上。(栈的内存是⾃动释放的,堆内存是.NET中会由GC来⾃动释放)
二、如何避免
减少new产⽣对象的次数 使⽤公⽤的对象,即静态成员Static,但要谨慎使⽤ 将String换成StringBuilder拼接字符串,string容易导致内存泄露使⽤对象池GamObject Pool在字符串暂存池中的是不会被GC的避免使⽤foreach,尽量使⽤for循环
三.接⼝是指定⼀组函数成员⽽不实现他们的引⽤类型。所以只能类和结构来实现接⼝,在继承该接⼝的类⾥⾯要实现接⼝的所有⽅法。
四.输出结果:AB
五.Assembly.LoadFrom()加载dll
assembly.GetType(“ClassA”);
type.GetMethod(“MethodA”);
六.unity不⽀持多线程,但可以使⽤多线程的类库进⾏多线程编程
Unity使⽤多线程注意:
变量都是共享的(都能指向相同的内存地址)UnityEngine的API不能在分线程运⾏ UnityEngine定义的基本结构(int,float,Struct定义的数据类型)可以在分线程计算,如 Vector3(Struct)可以,但Texture2d(class,根⽗类为Object)不可以。 UnityEngine定义的基本类型的函数可以在分线程运⾏Debug.Log()⽀持在⼦线程中调⽤
更多关于“unity游戏开发培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。