1. 程式人生 > >C#中的值類型和引用類型以及堆棧

C#中的值類型和引用類型以及堆棧

堆棧 ima tro nbsp 在線 hid class類 sed pen

引用類型如: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#中的值類型和引用類型以及堆棧