值型別與引用型別(執行緒堆疊與託管堆)

2021-07-11 14:19:33 字數 1439 閱讀 6184

一、.net 將變數的型別分為「值型別」與「引用型別」兩大類。諸如int 和float 之類的變數屬於值型別,而「類」型別的變數則屬於 「引用型別」。

值型別的變數一定義之後就馬上可用。比如定義「int i;」之後,變數i 即可使用。引用型別的變數定義之後,還必須用new 關鍵字建立物件後才可以使用。

二、值型別變數與引用型別變數的記憶體分配模型也不一樣

16 }

注意第12 和13 句。

程式的執行結果是:

b.i=100;

請讀者思索一下:兩個物件變數的相互賦值意味著什麼?

事實上,兩個物件變數的相互賦值意味著賦值後兩個物件變數所占用的記憶體單元其內容是相同的。講得詳細一些:第10 句建立物件以後,其首位址(假設為「1234 5678」)被放入到變數a 自身的4 個位元組的記憶體單元中。第12 句又定義了乙個物件變數b,其值最初為null(即對應的4 個位元組記憶體單元中為「0000 0000」)。第13 句執行以後,a 變數的值被複製到b 的記憶體單元中,現在,b 記憶體單元中的值也為「1234 5678」。

根據前面介紹的物件記憶體模型,我們知道現在變數a 和b 都指向同乙個例項物件。如果通過b.i 修改欄位i 的值,a.i 也會同步變化,因為a.i 與b.i 其實代表同一物件的同一字段。

整個過程可以用圖 9 來說明:

由此得到乙個重要結論:

物件變數的相互賦值不會導致物件自身被複製,其結果是兩個物件變數指向同一物件。另外,由於物件變數本身是乙個區域性變數,因此,物件變數本身是位於執行緒堆疊中的。

嚴格區分物件變數與物件變數所引用的物件,是物件導向程式設計的關鍵之一。

由於物件變數類似於乙個物件指標,這就產生了「判斷兩個物件變數是否引用同一物件」的問題。

c#使用「==」運算子比對兩個物件變數是否引用同一物件,「!=」比對兩個物件變數是否引用不同的物件。參看以下**:

//a1與a2引用不同的物件

a a1= new a();

a a2= new a();

console.writeline(a1 == a2);//輸出:false

a2 = a1;//a1與a2引用相同的物件

console.writeline(a1 == a2);//輸出:true

需要注意的是,如果「==」被用在值型別的變數之間,則比對的是變數的內容:

int i = 0;

int j = 100;

if (i == j)

理解值型別與引用型別的區別在物件導向程式設計中非常關鍵。

堆疊(值型別,引用型別)

一 堆疊的存在意義 由於不是系統和底層的,就簡單的談一談堆疊在c 中堆疊對於值型別 引用型別的意義 堆疊在這裡和棧等同 1 值型別 在c 中有int long float char bool enum struct 結構體 double等常用型別 這裡需要注意的是最後的struct 結構體 和cla...

值型別與引用型別

直白點兒說 值型別就是現金,要用直接用 引用型別是存摺,要用還得先去銀行取現。麥機長 我覺得這話十分形象。宣告乙個值型別變數,編譯器會在棧上分配乙個空間,這個空間對應著該值型別變數,空間裡儲存的就是該變數的值。引用型別的例項分配在堆上,新建乙個引用型別例項,得到的變數值對應的是該例項的記憶體分配位址...

值型別與引用型別

工作許久了,可是對c 中的值型別和引用型別卻一直無法很好的理解。這兩天花了不少時間查詢資料,看文章,終於有所收穫,在此將自己理解整理出來,方便日後自己檢視,同時希望對跟我有一樣困惑的朋友有所幫助。廢話不多說,下面開始說說怎麼理解值型別和引用型別!值型別資料直接在他自身分配到的記憶體中儲存資料,而引用...