1. 程式人生 > >c# - 資料型別之值型別,引用型別

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);