值型別和引用型別的儲存

2021-07-17 03:07:50 字數 1791 閱讀 5606

本文主要是討論棧和堆的含義,也就是討論

c#的兩種類據型別

:值型別和引用型別;

雖然我們在.net中的框架類庫中,大多是引用型別,但是我們程式設計師用得最多的還是值型別。

引用型別如:string,object,class等總是在從託管堆上分配的,c#中new操作符返回物件的記憶體位址--也就是指向物件資料的記憶體位址。

c#的值型別包括:結構體(數值型別,

bool

型,使用者定義的結構體),列舉,可空型別。

c#的引用型別包括:陣列,使用者定義的類、介面、委託,

object

,字串。

以下是值型別與引用型別的表:(值型別儲存在棧中,引用型別儲存在堆中)

我們來看下面一段**:

首先在類中宣告

乙個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 是一種型別安全的語言。每乙個變數都要求定義為乙個特定的型別,並且要求儲存在變數中的值只能是這種型別的值。變數既能儲存值型別,也可以儲存引用型別,還可以是指標。這一課將講述前兩種型別,關於指標的討論我們將在下一課中進行。下面是關於值型別和引用型別不同點的概論 如果乙個變數v儲存的是值型別,則它直接...

引用型別和值型別

c 中值型別和引用型別作為方法引數傳遞的時候其實都可以說是 值 的傳遞,只不過這裡的 值 指代的東西有所區別。當方法的引數為值型別時,方法傳遞的是值本身的值。當方法的引數為引用型別時,方法傳遞的則是應用型別的引用的位址,也就是引用型別位址在棧上的值。舉個引用型別作為引數傳遞的例子 static vo...

值型別和引用型別

為了更好地說明兩種型別之間的區別,借用如下的 來說明 值型別引用型別 記憶體分配地點 分配在棧中 分配在堆中 效率效率高,不需要位址轉換 效率低,需要進行位址轉換 記憶體 使用完後,立即 使用完後,不是立即 等待gc 賦值操作 進行複製,建立乙個同值新物件 只是對原有物件的引用 函式引數與返回值 是...