值類型和引用類型,棧和堆的含義

 

  本文主要是討論棧和堆的含義,也就是討論C#的兩種類據類型值類型和引用類型;程序員

  雖然咱們在.net中的框架類庫中,大可能是引用類型,可是咱們程序員用得最多的仍是值類型。框架

  引用類型如:string,Object,class等老是在從託管堆上分配的,C#中new操做符返回對象的內存地址--也就是指向對象數據的內存地址。ide

  如下是值類型與引用類型的表:post

 

 

   咱們來看下面一段代碼:spa

    首先在類中聲明一個class類,和一個struct結構,如圖:.net

  並使用在程序入口調用它們,如圖線程

 

 

   

    如今咱們來看一看,它們在內存當中是如何存儲的?code

 

    從這張圖能夠看出,class(類)實例化出來的對象,指向了內存堆中分配的空間對象

                         struct(結構) 實例化出來的對象,是在內存棧中分配blog

 

   接下來,咱們再來在上面的程序作以下修改:

  

    紅框,代碼定義一個class實例化對象s2,而後把對象s1賦值給s2

    藍框,代碼定義一個結構實例化對象r2,而後把對象r1賦值給r2

 

    那它們輸出的結果是多少呢?請選擇(   )

   

A、  s1的值爲:12     s2的值爲222
       r1的值爲:16     r2的值爲666

 

B、  s1的值爲:12     s2的值爲222
       r1的值爲:666    r2的值爲666

 

C、  s1的值爲:222    s2的值爲222
       r1的值爲:16     r2的值爲666

 

D、  s1的值爲:222     s2的值爲222
       r1的值爲:666     r2的值爲666

 

複製代碼

正確答案是:C

爲何會這樣呢?因此咱們來看一看,多個值類型和引用類型在內存裏面是如何存儲的,如圖:

  從圖中,能夠看出,兩個引用類型 s1,s2都指向了同一個拖管堆上的空間,

           當某一個發生改變的時候,其於的會發生變化

 

       而結構是值類型,雖然使用r2=r1,把r1對象賦值給r2,

     可是它會在線程棧中分配一個獨立的空間,

     當修改某一個對象的值的時候,複製代碼

 

 

 

   因此,值類型和引用類型的區別就是:

            一、它們存儲的位置不同

            二、若是是引用類型,當兩個對象指向同一個地方,修改某一個的時候,其它對象的值會發生改變

 

  案例代碼下載

相關文章
相關標籤/搜索