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#可以花時間把這個觀念弄懂。

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 波羅、希夏普2020 的頭像
    波羅、希夏普2020

    希夏普2020的程式天地

    波羅、希夏普2020 發表在 痞客邦 留言(0) 人氣()