標籤: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#中的實值型別和參考型別以及堆棧