1. C#中的數據類型分爲值類型,和引用類型
值類型,改變只改變該變量的值,
引用類型記錄的是一個地址,記錄其包含的所有變量的存儲位置。
舉個例子
using UnityEngine;
using System.Collections;
public class DatatypeScript : MonoBehaviour
{
void Start ()
{
//Value type variable
Vector3 pos = transform.position; //值類型,改變pos,不會改變transform
pos = new Vector3(0, 2, 0);
//Reference type variable
Transform tran = transform; //引用類型,改變pos,會改變transform,相當於C++中的引用(即別名)
tran.position = new Vector3(0, 2, 0);
}
}
也就是說,所有Class類型都是引用類型,如果不使用new的話,創建的都是原class的重命名,這一點跟C++差別很大:
2. 對於值類型的裝箱操作會引起GC,因爲要把值轉爲Object,而引用類型的裝箱操作則不會,因爲引用類型不會生成新的Object:
比如下列代碼,會引起GC
void Update()
{
int a = 5;
for (int i = 0; i < 400; i++)
{
UnityEngine.Profiling.Profiler.BeginSample("contain");
Func(a);
UnityEngine.Profiling.Profiler.EndSample();
}
}
public void Func(int p)
{
if ((System.Object)(p)==wp)
{
return ;
}
}
會引起GC