Value Type和Reference Type的比較
在C#中有分三種型別
1.Value Type 實質型別
2.Reference Type 參考型別
3.Pointer Type 指標型別
這三種型別中,比較常用的是實質型別和參考型別,今天先跟大家介紹這2種。
Value Type非常簡單,就是再存取資料的時候會多開一個記憶體區塊,不會和別人共用記憶體區塊,所使用的記憶體叫做Stack,因為記憶體是各自獨立的,所以資料內容就不會受到別人影響,這是Value Type。
Reference Type和Value Type就不一樣了,Reference使用的記憶體叫做Heap,會跟別人共用記憶體區塊,所以一個人變化時,共用這個記憶體區塊的人也會跟著變資料內容,這個是Reference Type。
有關於什麼是Stack和Heap?我之前就有寫過相關的文章了,大家可以參考我下面這篇文章
三種記憶體區間-Global、Stack、Heap
關於Value Type我們可以看一下這個範例。
Console.WriteLine("Value Type:");
int a = 10,b=20; a = b; b = 1; Console.WriteLine("a=" + a + "\t b=" + b); |
像這樣子因為是Value Type,所以最後的輸出結果也就很單純,結果如下
Value Type: a=20 b=1 |
由於變數屬於Value Type,各自有獨立的記憶體空間,所以不會互相影響,雖然最後設定b=1,但是這並不會影響a的值。
Reference Type則不一樣,會互相影響,可以看看下面的例子。
class Program { static void Main(string[] args) { Console.WriteLine("Reference Type:");
Human ming = new Human(); ming.age = 20; ming.gender = "男"; ming.name = "王小明";
Console.WriteLine("小明==>"+ming.info());
Human mei = new Human(); mei = ming; mei.gender = "女"; mei.name = "張美美";
Console.WriteLine("美美==>" + mei.info()); Console.WriteLine("小明==>"+ming.info()); } }
class Human { public string name; public string gender; public int age;
public string info() { return name + "," + gender + ","+age; } } |
這個範例是Reference Type,Class就是屬於Reference Type。
在程式中我建立了2個物件,ming和mei代表2個不同的人小明和美美,而由於2個物件已經設定了
mei = ming;
所以說是現在會是共用記憶體的狀態,最後結果如下:
Reference Type: 小明==>王小明,男,20 美美==>張美美,女,20 小明==>張美美,女,20 |
你看到可能會覺得很奇怪,為什麼後面小明和美美的狀態變成一樣了?在一開始時小明宣告了自己的資訊,這時候他還沒有受到美美這個物件的影響,但是後來就是這一行讓這2個物件共用記憶體空間。
mei = ming;
就是這個動作,小明的記憶體位址就這樣子複製給了美美,這個動作讓2個物件這時候就共用相同的記憶體空間,2個物件就會互相影響了。小明的資料內容和美美的資料內容會是一樣的,所以本來美美的age我沒有設定,但是我已經設定了小明的age
ming.age = 20;
所以印出結果美美的age就等於20,然後我又設定了美美的name和gender
mei.gender = "女";
mei.name = "張美美";
美美這邊設定了,小明也就會資料內容跟著美美一起變化,才會看到最後結果:
美美==>張美美,女,20
小明==>張美美,女,20
當然如果我再對小明的資料做變化,美美這個物件的資料內容也會改變的。
ming.name = "王大明"; ming.age = 25; Console.WriteLine("美美==>" + mei.info()); Console.WriteLine("小明==>" + ming.info()); |
最後輸出結果會像這樣:
美美==>王大明,女,25 小明==>王大明,女,25 |
至於C#中有哪些是屬於Value Type?哪些又是Reference Type?大家可以記住下面這句話
在C#中的變數是Value Type,Class是Reference Type。
對於初學者而言,大致上先這樣記就可以了。
Value Type和Reference Typee Type這是C#程式中滿重要的一個基礎觀念,希望大家學習C#可以花時間把這個觀念弄懂。
留言列表