c# - 資料型別之值型別,引用型別
c#資料型別分為值型別(Value types),引用型別(Reference types),以及指標型別(Pointer types),而指標型別只在不安全的程式碼中使用,本文不討論指標型別。
值型別的引用的本質是拷貝(copy),是創造一個新的記憶體單元來儲存,新記憶體單元的改變不會影響到被拷貝物件如
Vector3 pos = transform.position;
pos = new Vector3(0, 2, 0);
新建變數pos的任何改變都不會影響到transform中的position,因為它們是完全不同的記憶體單元,就像住在兩個不同的屋子裡。
引用型別
Transform tran = transform;
tran.position = new Vector3(0, 2, 0);
所以,變數tran的一切變化都會直接改變transform,因為它們其實共享同一個記憶體單元,就像住在同個屋子。
//Value type variable,物體的位置不變 Vector3 pos = transform.position; pos = new Vector3(0, 2, 0); //Reference type variable,物體的位置變化了 Transform tran = transform; tran.position = new Vector3(0, 2, 0);
這裡只討論值型別與引用型別的具體分類:
值型別,包括簡單型別(如字元型,浮點型和整數型等),列舉型別和結構型。
簡單型別有:主要有整型(有符號整形:sbyte,short,int,long;無符號整形:ubyte,ushort,uint,ulong),浮點型別(float,double),小數型別(decimal),布林型別(bool),字元型 (char)
列舉型別:是使用 enum 關鍵字宣告的型別。
enum <enum_name>
{
enumeration list
};
-
enum_name
-
enumeration list 是一個用逗號分隔的識別符號列表。
-
使用點操作符(".")引用。
//定義
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
//使用
int WeekdayStart = (int)Days.Mon;
結構型別:是使用 struct 關鍵字宣告的型別。
struct struct_name
{
public int id;
public string name;
};
使用點操作符引用。
(ps:Vector3、Quaternion是結構型別。)
引用型別包括類型別(所有其他型別的最終基類object,字串string,自定義的class),介面型別(使用interface定義的型別),陣列型別(一維陣列int[]和多維陣列int[][]),委託型別(delegate定義的型別)
類型別:
Transform tran = transform;
tran.position = new Vector3(0, 2, 0);
最常見的就是Classes下的Transfrom和GameObject。
介面型別:
interface interface1
{
void show();
}
介面只有方法,但所有方法中沒有執行程式碼
陣列型別:
一維陣列:
int[] a={0,1,2};
//等價於
int[] a=new int[] {0,1, 2};
二維多維陣列:
//建立一個2行三列的二維陣列
int[,] a = new int[2, 3];
//三維陣列
int[, ,] = new int[2, 3, 4};
交錯陣列:
int[][] a = new int[3][]
//必須初始化a的元素後才可使用它,初始化操作有以下:
//每個元素都是一維整數陣列。 第一個元素是由5個整陣列成的陣列,第二個是由4個整陣列成的陣列,以此類推
a[0] = new int[5];
a[1] = new int[4];
a[2] = new int[2];
//或者直接填充陣列:
a[0] = new int[] { 1, 3, 5, 7, 9 };
a[1] = new int[] { 0, 2, 4, 6 };
a[2] = new int[] { 11, 22 };
//
int[][] a = new int[][]
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};//這裡等號後面的new int[][]可省略,即寫成:
int[][] a =
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};
委託型別:
delegate double ParocessDelegate(double param1,double param2);