C 的裝箱和折箱

2021-04-27 11:49:11 字數 2452 閱讀 4631

c# 的裝箱和折箱

2023年10月15日 星期一 上午 10:50

在學習裝箱和折箱之前,我覺得有必要介紹一下c#中的"值型別"和"引用型別",以下觀點僅是個人學習心得和體會,不足之處多多指教~~!

先說一下c#中的"值型別"和"引用型別",這個先要從c#的原理中才好理解:

值型別:   它的資料儲存在記憶體中的堆疊中,每個變數或程式都有自己的堆疊,不可以共用乙個堆疊位址。當資料乙個值型別的變數傳遞到另乙個相同型別的變數時,會在堆疊中分配兩個不同的位址。

值型別資料:

所有數字資料型別

boolean、char 和 date

所有結構,即使其成員是引用型別

列舉,因為其基礎型別總是 byte、short、integer 或 long

引用型別:它的資料儲存在記憶體中的堆中,可以不同的變數或程式共同使用同乙個位置的資料。當資料從乙個引用型別的變數傳遞到另乙個相同型別的變數時,只是把這個變數的引用位址傳遞給新的變數,同時引用當前堆中儲存的資料。

引用型別資料:

string

所有陣列,即使其元素是值型別

類型別,如 form 委託

總結性的一句話:可以將引用型別指派給 object 資料型別的變數,object 變數總是持有指向資料的指標,從不持有資料本身。然而,如果將值型別指派給 object 變數,則 object 變數將表現得像持有自己的資料一樣。

例子是最能說明問題的:

///

/// 引用型別的人

///

class clsperson

///

/// 值型別的人

///

struct strperson

static void main(string args)

和", p1.name, p2.name);

console.writeline("現在把p1中的name的值改變");

p1.name = "deng";

console.writeline("現在p1和p2的中name的值分別為:和", p1.name, p2.name);

console.writeline("");

strperson sp1 = new strperson();

sp1.name = "lydia";

strperson sp2 = new strperson();

sp2 = sp1;

console.writeline("現在sp1和sp2的中name的值分別為:和", sp1.name, sp2.name);

console.writeline("現在把sp1中的name的值改變");

sp1.name = "xia";

console.writeline("現在sp1和sp2的中name的值分別為:和", sp1.name, sp2.name);

}在引用型別中,改變其中乙個的值,另乙個也會跟差改變,因為他們都是引用的同乙個記憶體位址,

在值型別中,改變其中乙個的值,另乙個不會變,因為在建立的時候,他們分別有了不同的記憶體位址。

但是要注意一種情況,如下示例:

string a = "this is string a";

string b = a;

a = "this is not string a now!";

console.writeline("now a is: ", a);

console.writeline("now b is: ", b);

或:object a = 10;

object b = a;

a = 20;

console.writeline(a.tostring());

console.writeline(b.tostring());

這裡的b不是指向a的位址,而是重新開了另乙個記憶體空間,所以這裡顯示的結果a和b是絕對不相同的!

這個地方為什麼會產生這樣的結果還不是很明白,等明白了再補上~~

明白了引用型別和值型別這後,對了裝箱和折箱就簡單得多了,

裝箱:是把值型別轉為引用型別,如:

int a = 10;

object b = a;

console.writeline(b.tostring());

在這個裝箱的過程中,有以下動作:1)劃分堆疊記憶體,在堆疊上分配的記憶體 = a的大小 +b及其結構所占用的空間;(2)a被複製到新近分配的堆疊中;(3)將分配給b的位址壓棧,此時它指向乙個object型別,即引用型別。

折箱則相反,把引用型別轉為值型別,如:

object c = 5;

int d = (int)c;

console.writeline(d.tostring());

在這個折箱的過程中,有以下動作:1)環境須先判斷堆疊上指向合法物件的位址,以及在對此物件向指定的型別進行轉換時是否合法,如果不合法,就丟擲異常;(2)當判斷型別轉換正確,就返回乙個指向物件內的值的指標。

C 裝箱 折箱

裝箱 boxing 和拆箱 unboxing 是c 型別系統的核心概念.是不同於c與c 的新概念!通過裝箱和拆箱操作,能夠在值型別和引用型別中架起一做橋梁.換言之,可以輕鬆的實現值型別與引用型別的互相轉換,裝箱和拆箱能夠統一考察系統,任何型別的值最終都可以按照物件進行處理.c 語言中的所有型別都是由...

匯入 全面認識裝箱與折箱

學c 有近一年了,對裝箱與拆箱有了一定的了解,但昨天晚上看了.framework程式設計後,才發現自己的認識都只是片面的。首先說明 為什麼要清楚裝箱與折箱,因為裝箱與折箱對程式的效能有很大的影響,因此在寫 的時候要時刻注意這些問題。裝箱與折箱都只對值型別資料而言,而對於引用型別資料,都是在託管的堆上...

c 裝箱和拆箱

c 裝箱和拆箱 概念 裝箱 將值型別轉換為引用型別的過程叫做裝箱 值型別 引用型別 相反,拆箱 將引用型別轉換為值型別 叫做拆箱 引用型別 值型別 裝箱例子 int i 2008 object obj i console.writeline 1 i的值為,裝箱之後的值 i,obj i 927 con...