原文出自
本文主要是討論棧和堆的含義,也就是討論
c#的兩種類據型別
:值型別和引用型別;
雖然我們在.net中的框架類庫中,大多是引用型別,但是我們程式設計師用得最多的還是值型別。
引用型別如: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 的兩種類據型別 值型別和引用型別 雖然我們在.net中的框架類庫中,大多是引用型別,但是我們程式設計師用得最多的還是值型別。引用型別如 string,object,class等總是在從託管堆上分配的,c 中new操作符返回物件的記憶體位址 也就是指向物件資...
值型別和引用型別,棧和堆的含義
本文主要是討論棧和堆的含義,也就是討論 c 的兩種類據型別 值型別和引用型別 雖然我們在.net中的框架類庫中,大多是引用型別,但是我們程式設計師用得最多的還是值型別。引用型別如 string,object,class等總是在從託管堆上分配的,c 中new操作符返回物件的記憶體位址 也就是指向物件資...
值型別和引用型別,棧和堆的含義
本文主要是討論棧和堆的含義,也就是討論c 的兩種類據型別 值型別和引用型別 雖然我們在.net中的框架類庫中,大多是引用型別,但是我們程式設計師用得最多的還是值型別。以下是值型別與引用型別的表 我們來看下面一段 首先在類中宣告乙個class類,和乙個struct結構,如圖 並使用在程式入口呼叫它們,...