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...