C#中的實值型別和參考型別以及堆棧

來源:互聯網
上載者:User

標籤:close   toolbar   實值型別   com   使用   span   輸出   選擇   正確答案   

參考型別如:string,Object,class等總是在從託管堆上分配的,C#中new操作符返回對象的記憶體位址--也就是指向對象資料的記憶體位址。

以下是實值型別與參考型別的表:

 

我們來看下面一段代碼:

首先在類中聲明一個class類,和一個struct結構,

並使用在程式入口調用它們,

 

 

現在我們來看一看,它們在記憶體當中是如何儲存的?

 

從這張圖可以看出,class(類)執行個體化出來的對象,指向了記憶體堆中分配的空間

struct(結構) 執行個體化出來的對象,是在記憶體棧中分配

 

接下來,我們再來在上面的程式做如下修改:

紅框,代碼定義一個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,

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

當修改某一個對象的值的時候,不會影響到另一個對象

 

 

所以,實值型別和參考型別的區別就是:

1、它們儲存的位置不一樣

2、如果是參考型別,當兩個對象指向同一個地方,修改某一個的時候,其它對象的值會發生改變

 

C#中的實值型別和參考型別以及堆棧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.