前言
在 C# 世界裡,資料型態分為 實值型別(Value Type) 與 參考型別(Reference Type),例如像 int
、char
、byte
…等屬於實值型別,class
、object
、string
、List
…等屬於參考型別,辨別方法為參考類型需使用 new
關鍵字實體化,但請記得 string
也屬於參考型別(詳細請參閱),而兩者主要的差異在於存儲方式。
實值型別:
變數和值都會存放於 堆疊(Stack)
記憶體,當變數指派一個實值型別的值例如 var a = 123
,則會在 Stack
新增一塊區域儲存,若 var b = a
,則會在複製一份 a
的值指派給 b
,彼此間互相獨立。
如下:
參考型別:
變數會存放於 堆疊(Stack)
記憶體,而值會存放於 堆積(Heap)
記憶體中的某個位址,當變數指派一個參考型別的值,變數則會指向該 Heap
記憶體位址,例如 var a = new List<int>()
當中 a
會指向該 List
的記憶體位址進而得到物件,而當 var b = a
,則會在 Stack
新增一塊空間給 b
而值則指向和 a
相同的記憶體位址,彼此共用物件,當任一方改動,則會影響到另一方。
如下:
驗證
實值型別:
void Main()
{
// 實值型別
var a = 123;
var b = a;
b -= 100;
Console.WriteLine("a = " + a);
Console.WriteLine("b = " + b);
// Output
// a = 123
// b = 23
}
a
、b
彼此間互相獨立,互不影響。
參考型別:
void Main()
{
// 參考型別
var a = new List<int>() { 1,2,3 };
var b = a;
b.Add(4);
b.Add(5);
b.Add(6);
a.Remove(6);
Console.WriteLine("a = " + string.Join(",", a));
Console.WriteLine("b = " + string.Join(",", b));
// Output
// a = 1,2,3,4,5
// b = 1,2,3,4,5
}
a
、b
彼此共用物件,當任一方改動,都會影響到另一方。