C 裝箱與拆箱

2021-07-05 17:44:23 字數 1339 閱讀 1404

在生活中,我們都喜歡吃水果。大家都知道水果不但為我們提供豐富的膳食纖維,還有維生素及其它營養。例如:吃士多啤梨培養耐心補充維生素,吃香蕉保持快樂心情,吃葡萄增強免疫抗衰老,吃梨幫助器官排毒等等,所有我們經常去買水果,而一般水果都是裝在箱子裡,廠商把水果裝箱賣給經銷商,經銷商在拆箱賣給我們。這就是生活中的裝箱和拆箱,然而c#中的又是如何的呢?

值型別到引用型別或到此值型別所實現的任何介面型別的隱式轉換

**展示:

public class test

//我們在這裡更改i的值

i = 222;

console.writeline("int i現在的值是:",i);

console.writeline("int i裝箱的值是:",obj);

}

從引用型別到任意值型別的顯式轉換

**展示:

int i = 10;

object obj = i;

int j = (int)obj;

一種最普通的場景是,呼叫乙個含型別為object的引數的方法,該object可支援任意為型,以便通用。當你需要將乙個值型別(如int32)傳入時,需要裝箱。 

另一種用法是,乙個非泛型的容器,同樣是為了保證通用,而將元素型別定義為object。於是,要將值型別資料加入容器時,需要裝箱。

裝箱: 

對值型別在堆中分配乙個物件例項,並將該值複製到新的物件中。按三步進行。 

第一步:新分配到堆記憶體。

第二步:將值型別的例項字段拷貝到新分配的記憶體中。 

第三步:返回託管堆中新分配物件的位址。這個位址就是乙個指向物件的引用了。 

拆箱:檢查物件例項,確保它是給定值型別的乙個裝箱值。將該值從例項複製到值型別變數中。 

有書上講,拆箱只是獲取引用物件中指向值型別部分的指標,而內容拷貝則是賦值語句之觸發。我覺得這並不要緊。最關鍵的是檢查物件例項的本質,拆箱和裝箱的型別必需匹配

裝箱和拆箱雖然滿足了兩隻型別之間的轉換。但是從裝箱的過程中不難看出,每次裝箱時要在堆中new乙個新的物件,當量特別大是肯定會大大影響程式的效率。

在應用中,我們應該盡量避免裝箱操作。了解了裝箱和拆箱的操作,我們可以清楚的明白:裝箱操作會導致資料在堆和棧上進行拷貝,頻繁的裝箱操作會效能損失。而相比而言拆箱過程對效能損耗還是比較小的。

C 裝箱與拆箱

要掌握裝箱與拆箱,就必須了解cts及它的特點。net重要技術和基礎之一的cts common type system 顧名思義,cts就是為了實現在應用程式宣告和使用這些型別時必須遵循的規則而存在的通用型別系統。net將整個系統的型別分成兩大類 value type 和 reference type...

C 裝箱與拆箱

裝箱是將 值型別轉換為 引用型別 拆箱是將 引用型別 轉換為值型別 利用裝箱和拆箱功能,可通過允許 值型別的任何值與 object 型別 的值相互轉換,將值型別與引用型別鏈結起來 例如 int val 100 object obj val console.writeline 物件的值 obj 這是乙...

C 裝箱與拆箱

在前面提到了值型別和引用型別。這裡就來和大家一起了解一下,他們互相轉換的過程裝箱 boxing 拆箱 unboxing 由於c 中所有的資料型別都是由基類system.object繼承而來的,所以值型別和引用型別的值可以通過顯式 或隱式 操作相互轉換,而這轉換過程也就是裝箱 boxing 和拆箱 u...