声明:此篇文章是个人学习心得,并非教程。不保证百分百正确,仅供参考。如有错误,欢迎指出。谢谢!
值类型
值类型包含整形,浮点型,bool,struc,char,enum
值类型的数据存储在栈上,超出作用域会自动清理。(栈存储空间小,读取速度快。)
值类型如果作为参数传入,则会开辟新的副本,来存取传入参数的数据。原先的值类型数据不会变。
引用类型
引用类型包含string,Array,class,Object,interface,delegate
引用类型的数据存储在堆上,由GC清理,栈上存储的是引用地址。(堆存储空间大,读取速度慢。)
引用类型作为参数传入,则会开辟新的引用地址,两个引用地址会指向同一个实例化的对象数据。实例数据会随着改变而改变。
装箱和拆箱
装箱:值类型转换为引用类型
拆箱:引用类型转为值类型
装箱的操作:
1.分配内存堆
2.值类型数据拷贝到内存堆上
3.将栈上引用地址指向内存堆
拆箱的操作:
1.检测引用类型的数据是不是传入的值类型的数据
2.将该值赋值到栈中的值类型
Unity中值类型和引用类型数据的输入输出
值类型传参
先来看看值类型传参的例子,如图所示
![](https://img-blog.csdnimg.cn/b2867c4a52294d9da44abb4c2a87e0e7.png)
最终打印的消息:
0
Alice
7
我相信很多一开始都和我一样,想着值类型传参不是不改变数据本身,所以不是应该是0,alice,1么。但其实我们看下面这幅图就好理解了。
![](https://img-blog.csdnimg.cn/947876f37b1f4d91ac58cb675b80a6b1.png)
从上面我们可以看到,传入参数的值类型就是不改变数据本身没错,而string是特殊的引用类型,也不改变传入参数的数据,数组引用类型,改变数据间接也改变原本数据。所以打印就是0,Alice,7。
引用类型传参
看一下图片例子
![](https://img-blog.csdnimg.cn/c45a84da180c46b4a3b90b9dc375a2fa.png)
最终打印的消息:
2
Moxi
7
理解了上面的值类型传参,有人看到引用类型传参。可能又要犯嘀咕了。不是说值类型不改变数据本身嘛,最终id咋又变成2了。而且string不是特殊的引用类型嘛。让我们来看下面这图就明白了。
![](https://img-blog.csdnimg.cn/4d38cd249f6a44e6a968b4a364a3a7a7.png)
因为传入的其实都指针,就很好理解了。都是引用类型,所以修改的时候就把原先指向的数据地址也变了。所以日志打印的就是2,Moxi,7。