在用Unity3D開發遊戲項目前,首先要對Unity3D選擇提供給遊戲開發者的腳本語言C#的特點要有一定了解,在C#中有兩種類型:值類型和引用類型。
值類型和引用類型的區別如下:
1、值類型是直接存儲值,引用類型是存儲對值的引用。
2、引用類型總是被放在堆中,而值類型總是放在它被聲明的地方(注意“引用類型保存在堆上,值類型保存在線程棧上”這句話是不準確的,值類型雖然大多數時候保存在線程棧上,但是有些時候也會保存在堆上,比如類中的成員變量)。
3、當比較兩個值類型的時候,進行的是內容比較;當比較兩個引用類型的時候,進行的是引用比較。
4、值類型都是派生自抽象類型System.ValueType的,引用類型的基類都是Object。
值類型和引用類型的關係圖如下:
這裏有幾個容易搞錯的點:
1、string類型即System.String,雖然string類型是不可變的,但它是引用類型而不是值類型。string類型的值並非一個實際的字符串,而是對字符串的一個引用,但是string的比較可以用==或者Equal(),會比較string類型的值而不是引用,這一點看起來像是值類型的特點,實際上是因爲重載了運算符==和方法Equal。
2、struct值類型而不是引用類型。
3、賦值的機制值類型和引用類型是不同的,將一個值類型變量賦給另一個值類型變量時,將複製其包含的值。引用類型變量的賦值只複製對對象的引用,不復制對象本身。(另:將值類型變量賦給引用類型變量時就涉及到裝箱和拆箱了)