C# Boxing vs UnBoxing

  • 986
  • 0
  • c#
  • 2019-04-29

在.NET有分兩種類型

  1. 值類型(int,double,char....)
  2. 參考類型(自行宣告的類別,string....)

而存放資料的方式也有兩種:

  1. 堆疊Stack  
  2. 堆積Heap

談談Boxing和UnBoxing之前,我們先來了解StackHeap

 

值類型(Value Type)會存取在Stack記憶體區塊中

參考類型(Reference Type)內容會在Heap記憶體區塊上,Stack會指向Heap上記憶體位置(有點像c++傳址)

如下圖

了解StackHeap

我們來談談BoxingUnBoxing


Boxing:

型態由大轉小

int i=20;

object o=(object)i;
 int強制轉型為object 因為我們所有物件都是繼承於object物件

 

原本值類型存在Stack中,但因為我們強轉成Object 20 會存在Heap記憶體區塊中.

如下圖

 


UnBoxing:

型態由小轉大(小轉大會有轉型出錯的問題)

int i=20;
object o=(object)i;
int j=(int)o;

將o Object強轉成int 在這個案例不會有問題,但如果是將o轉為char就會有問題 

在執行UnBoxing 如下圖 

可以看到原本存在Heap上的值 我們會把他搬回Stack並附值給J

 

參考MSDN https://msdn.microsoft.com/zh-tw/library/yz2be5wk.aspx


如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^