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