Unity中的值传递与引用传递

1. 值类型

  值类型变量本身保存了该类型的全部数据,当声明一个值类型的变量时,该变量会被分配到栈(Stack)上。

2. 引用类型

  引用类型变量本身保存的是位于堆(Heap)上的该类型的实例的内存地址,并不包含数据。当声明一个引用类型变量时,该变量会被分配到栈上。如果仅仅只是声明这样一个变量,由于在堆上还没有创建该类型的实例,因此,变量值为null,意思是不指向任何类型实例(堆上的对象)。对于变量的类型声明,用于限制此变量可以保存的类型。 

3. Unity中的值类型与引用类型

  值类型包括结构体(struct)和枚举(enum)。

  引用类型包括类(class)、接口(interface)、委托(delegate)、数组(array)等。

4.说点人话

  常见的简单类型如short、int、long、float、double、byte、char等其本质上都是结构体,对应struct System.Int16、System.Int32、System.Int64、System.Single、System.Double、Syetem.Byte、System.Char,因此它们都是值类型。但string和object例外,它们本质上是类,对应class System.String和System.Object,所以它们是引用类型。

  但是string又有值传递的效果,这是因为string是常量,不能更改,所以如果在函数里更改的话,其实是生成了另外一个string,但是原来的string还在,函数外的string还是原来的string。函数里的string指向另外一个新生成的string,给人一种值传递的假象。

string a = "aaa"; //==> a----->new String("aaa") 
string b = a; //==> b----->a, 传引用 
b = "bbb"; //==> b----->new String("bbb"), 传引用,b指向了一个新的字符串,a并没有变。

  Vector3本质是结构体(struct),所以是值类型。

  组件(component)本质是类(class),所以是引用类型。

posted @ 2018-03-28 10:02  Don_Yao  阅读(3153)  评论(0编辑  收藏  举报