C 堆與棧 值型別 引用型別

2022-09-19 13:30:14 字數 1805 閱讀 2097

先說c#中值型別和引用型別

概念:

1.值型別:資料儲存在記憶體的堆疊中,從堆疊中可以快速地訪問這些資料,因此,值型別表示實際的資料。

2.引用型別:表示指向儲存在記憶體堆中的資料的指標或引用(包括類、介面、陣列和字串)。

c#中定義的值型別包括原型別(sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、bool、decimal)、列舉(enum)、結構(struct)

引用型別包括:類、陣列、介面、委託、字串等。

我們要非常的清楚堆和棧是兩個不同的概念 ,在c#中,我們把引用型別放在堆中,把值型別放在棧中。

,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。

,就是那些由 new 分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個 new 就要對應乙個 delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。堆可以動態地擴充套件和收縮。

堆和堆疊區別:

堆和堆疊是兩個不同的概念,在記憶體中的儲存位置也不相同,

堆一般用於儲存可變長度的資料,如字串型別;

堆疊則用於儲存固定長度的資料,如整型型別的資料int。由資料儲存的位置可以得知,當把乙個值變數賦給另乙個值變數時,會在堆疊中儲存兩個完全相同的值;而把乙個引用變數賦給另乙個引用變數,則會在堆疊中儲存對同乙個堆位置的兩個引用,即在堆疊中儲存的是同乙個堆的位址。在進行資料操作時,對於值型別,由於每個變數都有自己的值,因此對乙個變數的操作不會影響到其它變數;對於引用型別的變數,對乙個變數的資料進行操作就是對這個變數在堆中的資料進行操作,如果兩個引用型別的變數引用同乙個物件,實際含義就是它們在堆疊中儲存的堆的位址相同,因此對乙個變數的操作就會影響到引用同乙個物件的另乙個變數。

如圖如果我們定義乙個陣列

並且賦值 int nums=;

nums[0]:訪問的是堆中的內容

那麼請接著看如下**:

public void method1()
(參照理解)

第1行:當這行**執行時,編譯器為它分配一小塊棧記憶體。執行時棧負責提供程式所需的記憶體;

第2行:程式繼續執行。如同名字一樣,棧在第一塊記憶體的頂部分配了一塊記憶體。

第3行:在第3行,我們建立了乙個物件。當該行執行時,真實的物件儲存在另一種叫「堆」的記憶體中。堆用於動態分配記憶體。

值傳遞引用傳遞:

引用型別作為引數時:

1、在修改變數本身時,結果類似於值傳遞,即不會改變傳遞前的變數的值

2、在修改變數的屬性或字段時,才是引用傳遞,會影響到傳遞前的變數的值

3、引數使用了ref後,才是真正的引用傳遞,不管修改變數本身還是修改變數的屬性或字段,都會影響到傳遞前的變數的值

值傳遞:傳的是物件的值。

引用傳遞:傳的是棧中物件的位址。

class t

public void test1(stringbuilder strb)

public void test2(ref stringbuilder strb)

}

C 堆VS棧 值型別VS引用型別

最近上連續出現了幾篇關於堆vs棧 值型別vs引用型別的文章。乙個是關於c 堆vs棧的,深入淺出,清晰明了,鏈結如下 c 堆疊對比 part one c 堆疊對比 part two c 堆疊對比 part three c 堆疊對比 part four the truth about value typ...

值型別何引用型別,堆和棧

本文主要是討論棧和堆的含義,也就是討論 c 的兩種類據型別 值型別和引用型別 雖然我們在.net中的框架類庫中,大多是引用型別,但是我們程式設計師用得最多的還是值型別。引用型別如 string,object,class等總是在從託管堆上分配的,c 中new操作符返回物件的記憶體位址 也就是指向物件資...

C 值型別與引用型別

1.主要內容 型別的基本概念 值型別深入 引用型別深入 值型別與引用型別的比較及應用 2.基本概念 c 中,變數是值還是引用僅取決於其資料型別。c 的基本資料型別都以平台無關的方式來定義,c 的預定義型別並沒有內置於語言中,而是內置於.net framework中。net使用通用型別系統 cts 定...