[C#]的類型系統

  • 232
  • 0
  • C#
  • 2020-07-20

若想要了解Call by Reference與Call by Value的區別,則要先了解類型系統。

Q: C#含有那些資料型別呢?
A: C#的類型系統含有參考型別與數值型別兩種,參考型別包括了類別類型、接口類型與委託類型;數值型別包含了結構類型與列舉類型;而所有類型均以Object為自己的基底類型(Base Type)。

[註:參考型別裡的自建類別,敘述有誤,應該為類別類型(Form class, Window class,.....etc)]

  •  數值型別(Value Type)沒有Instance,所謂的"Instance"與變數(Variable)合而為一。
int x = 100;
//相等於:

int x = new int();
x = 100;

  • 在方法(Method函式)中的所有變數,均稱為"區域變數(Local Variable)",它們在程式執行之後,會在記憶體空間的Stack(堆疊)區域分配儲存空間。
  • 而區域變數又分為數值型別變數 與 參考型別變數,數值型別變數在Stack區域會直接儲存數值資料的二進位值參考型別變數在Stack區域會儲存一個記憶體地址的二進位值,此地址會與Heap(堆積)區域裡的物件資料們形成參照。
  • 這裡談到的物件們均有其唯一性,使用物件類別變數來儲存資料,其也有唯一性;沒有唯二,最後一次對此變數設的值,就是我們會取得的值。(補充:陣列變數也是物件類別變數)
  • 區域變數在程式執行之前,必須要有明確的賦值。

C#的裝箱與拆箱:
裝箱(Boxing):將Stack區域的數值資料打包成物件,搬運到Heap區域儲存。
拆箱(Unboxing):將Heap區域的物件資料拆封成數值,搬運到Stack區域儲存。
 

//裝箱
int x=100;
object obj=x;

//拆箱
int y=(int)obj;

 

如有敘述錯誤,還請不吝嗇留言指教,thanks!