值型別和引用型別的總結

2022-07-16 01:39:13 字數 1137 閱讀 4164

一、棧和堆的理解

棧是一種後進先出的資料結構,在記憶體中,變數被分配在棧上進行操作;堆是用來為物件分配空間的一塊記憶體區域,在堆上建立乙個物件時,會將物件的位址傳遞給棧上的變數,反過來叫變數引用該物件。

二、值型別

值型別包括了結構、列舉和一些簡單型別如int、byte等,所有的值型別都隱式繼承自system.valuetype這個類型別,而這個型別和引用型別全都繼承自system.object基類。

因為結構隱式繼承自system.valuetype型別,所以結構不再支援繼承。值操作在棧上進行,值操作是一種入棧出棧的過程。要想呼叫結構中的方法或變數時,需要對結構中的變數進行復賦值後才可使用。例如:

namespace

test

}public

struct

student

}}

**中,student std=new student();是編譯器隱式為結構建立無引數的建構函式,在建構函式中會對結構中的變數進行初始化,這樣我們就省去了對結構中的變數逐一初始化。

這裡,new操作符不分配記憶體,也不建立例項,只是呼叫了預設的建構函式來初始化結構中的所有字段。

三、引用型別

引用型別包括類、介面、委託等。

宣告乙個引用型別變數時,使用new操作符建立引用例項的時候,該變數被分配到執行緒棧上,變數儲存了堆上的位址。當使用「==」對引用型別變數比較時,實際上是比較兩個引用型別是否指向堆上的同一物件。

說明:string是一種特殊的引用型別。

四、裝箱和拆箱

裝箱:值型別轉換成等價的引用型別。

大體過程:

1.在堆上為新生成的物件例項分配記憶體;

2.將棧上的值型別變數的值複製到堆上的物件中;

3.將堆上建立的物件位址返回給引用型別變數;

例如:

int i=1

;object boxed =i;

console.writeline(boxed);

拆箱:將引用型別轉換成值型別。

過程:1.獲取已裝箱的物件位址;

2.將值從堆上的變數中複製到堆疊上的值變數中;

注意:頻繁的在堆上進行操作將會大大消耗記憶體,因此在程式設計中盡量避免裝箱拆箱過程。

女猿一枚,為生活而不斷拼搏,相信努力定會有收穫!

C 值型別和引用型別總結

c 的值型別包括 結構體 數值型別,bool型,使用者定義的結構體 列舉,可空型別。c 的引用型別包括 陣列,使用者定義的類 介面 委託,object,字串。陣列的元素,不管是引用型別還是值型別,都儲存在託管堆上。引用型別在棧中儲存乙個引用,其實際的儲存位置位於託管堆。為了方便,本文簡稱引用型別部署...

引用型別和值型別

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

引用型別和值型別

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