在用Unity3D开发游戏项目前,首先要对Unity3D选择提供给游戏开发者的脚本语言C#的特点要有一定了解,在C#中有两种类型:值类型和引用类型。
值类型和引用类型的区别如下:
1、值类型是直接存储值,引用类型是存储对值的引用。
2、引用类型总是被放在堆中,而值类型总是放在它被声明的地方(注意“引用类型保存在堆上,值类型保存在线程栈上”这句话是不准确的,值类型虽然大多数时候保存在线程栈上,但是有些时候也会保存在堆上,比如类中的成员变量)。
3、当比较两个值类型的时候,进行的是内容比较;当比较两个引用类型的时候,进行的是引用比较。
4、值类型都是派生自抽象类型System.ValueType的,引用类型的基类都是Object。
值类型和引用类型的关系图如下:
这里有几个容易搞错的点:
1、string类型即System.String,虽然string类型是不可变的,但它是引用类型而不是值类型。string类型的值并非一个实际的字符串,而是对字符串的一个引用,但是string的比较可以用==或者Equal(),会比较string类型的值而不是引用,这一点看起来像是值类型的特点,实际上是因为重载了运算符==和方法Equal。
2、struct值类型而不是引用类型。
3、赋值的机制值类型和引用类型是不同的,将一个值类型变量赋给另一个值类型变量时,将复制其包含的值。引用类型变量的赋值只复制对对象的引用,不复制对象本身。(另:将值类型变量赋给引用类型变量时就涉及到装箱和拆箱了)