本文主要是討論棧和堆的含義,也就是討論C#的兩種類據類型:值類型和引用類型;程序員
雖然咱們在.net中的框架類庫中,大可能是引用類型,可是咱們程序員用得最多的仍是值類型。框架
引用類型如:string,Object,class等老是在從託管堆上分配的,C#中new操做符返回對象的內存地址--也就是指向對象數據的內存地址。ide
如下是值類型與引用類型的表:post
咱們來看下面一段代碼:spa
首先在類中聲明一個class類,和一個struct結構,如圖:.net
並使用在程序入口調用它們,如圖:線程
如今咱們來看一看,它們在內存當中是如何存儲的?code
從這張圖能夠看出,class(類)實例化出來的對象,指向了內存堆中分配的空間對象
struct(結構) 實例化出來的對象,是在內存棧中分配blog
接下來,咱們再來在上面的程序作以下修改:
紅框,代碼定義一個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
因此,值類型和引用類型的區別就是:
一、它們存儲的位置不同
二、若是是引用類型,當兩個對象指向同一個地方,修改某一個的時候,其它對象的值會發生改變