C#之理解值類型和引用類型

     工作許久了,可是對C#中的值類型和引用類型卻一直無法很好的理解。這兩天花了不少時間查找資料,看文章,終於有所收穫,在此將自己理解整理出來,方便日後自己查看,同時希望對跟我有一樣困惑的朋友有所幫助。廢話不多說,下面開始說說怎麼理解值類型和引用類型

     值類型數據直接在他自身分配到的內存中存儲數據,而引用類型只是包含指向存儲數據位置的指針。

     那麼有哪些類型是值類型的呢,我把他們歸納成三類:

  1.      基礎數據類型(string類型除外):包括整型、浮點型、十進制型、布爾型。
    • 整型包括:sbyte、byte、char、short、ushort、int、uint、long、ulong 這九種類型;
    • 浮點型就包括 float 和 double 兩種類型;
    • 十進制型就是 decimal ;
    • 布爾型就是 bool 型了。
  2.      結構類型:就是 struct 型
  3.      枚舉類型:就是 enum 型

     引用類型有五種:class、interface、delegate、object、string 

     上面說的是怎麼區分哪些值類型和引用類型,而使用上也是有區別的。所有值類型的數據都無法爲null的,聲明後必須賦以初值;引用類型才允許爲null。

ContractedBlock.gifExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->int i = 0;
//或者
int i = new int();
//以上兩種都是可以正確的且是等同的

int i = null;//這樣的語句是無法通過編譯的,因爲i是值類型的,是不允許爲null的

class c = null;//這樣則是可以通過編譯的,這裏的c是引用類型的,允許爲null

 

     值類型和引用類型在賦值(或者說複製)的時候也是有區別的。值類型數據在賦值的時候是直接複製值到新的對象中,而引用類型則只是複製對象的引用。例如:

 

ContractedBlock.gifExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->public class abc
{
    
public int Attribute;
    
public abc()
    {
        Attribute 
= 1;
    }
}

public static void Main()
{
    
int i = 0;
    
int j = i;
    i 
= 1;
    Console.WriteLine(
"i={0}",i);
    Console.WriteLine(
"j={0}",j);
    
//結果是:
    
//i=1
    
//j=0

    abc a1 
= new abc();
    abc a2 
= a1;
    a1.Attribute 
= 2;
    Console.WriteLine(
"a1={0}",a1.Attribute);
    Console.WriteLine(
"a2={0}",a2.Attribute);
    
//結果是:
    
//a1=2
    
//a1=2
}

     這個例子就很好的說明了值類型和引用類型的不同了。

     最後還有值類型要麼是分配在堆棧的,要麼就是在結構中以內聯方式分配的。引用類型是分配在堆的。引用類型和值類型都是從基類 Object 派生出來的。當值類型需要充當對象時,就在堆上分配一個包裝(該包裝能使值類型看上去像引用對象一樣),並且將該值類型的值複製給它。該包裝被加上標記,以便系統知道它包含一個值類型。這個進程稱爲裝箱,反過來操作就稱爲拆箱。裝箱和拆箱能夠使任何類型像對象一樣進行處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章