2014-03-04 36 views
1

int i = 5;無論是拳擊還是拆箱?

string str = i.ToString();

String str1 =(String)i.ToString();

作爲Int's爲值類型和String的是參考類型

因此無論是拳擊或開箱???

編輯: 現在是第二個聲明無論是拳擊還是拆箱???

+0

爲了拆箱,您必須明確地提及數據類型,如其拆箱版本是:string str =(string)i; –

+1

我不認爲這是拳擊或拆箱。 – 2014-03-04 05:33:45

+0

@UsmanWaheed是拆箱? –

回答

0

裝箱是將值類型轉換爲類型對象或由此值類型實現的任何接口類型的過程。當CLR放置一個值類型時,它將該值包裝在System.Object中並將其存儲在託管堆中。

拆箱從對象中提取值類型。 拳擊是隱含的;拆箱是明確的。

裝箱和拆箱的概念是類型系統的C#統一視圖的基礎,其中任何類型的值都可以視爲對象。

在下面的示例中,整數變量i被裝箱並分配給對象o。

C#

int i = 123; 
// The following line boxes i. 
object o = i; 

然後將對象O可以是裝箱並分配給整數變量i:

C#

o = 123; 
i = (int)o; // unboxing 
+2

答案很清楚,但是你沒有回答他的代碼是拳擊還是取消裝箱的實例。 –

1

拳擊是轉換值的處理鍵入到類型對象或由此值類型實現的任何接口類型。拆箱從對象中提取值類型。 在這種情況下,它既不是拳擊也不是拆箱。

4

您的代碼不是拆箱或裝箱的示例,而是方法調用Int32.ToString()並將返回值分配給stringi.ToString()調用不會將int分配給對象,但會將其傳遞給返回string的方法。第二行與(string)轉換是多餘的,C#編譯器甚至不會將它發送到IL中。

例如,如果你在一個主要方法有這樣的:

.method private hidebysig static 
    void Main (
     string[] args 
    ) cil managed 
{ 
// Method begins at RVA 0x2050 
// Code size 19 (0x13) 
.maxstack 1 
.entrypoint 
.locals init (
    [0] int32 i 
) 

IL_0000: ldc.i4.5 
IL_0001: stloc.0 
IL_0002: ldloca.s i 
IL_0004: call instance string [mscorlib]System.Int32::ToString() 
IL_0009: pop 
IL_000a: ldloca.s i 
IL_000c: call instance string [mscorlib]System.Int32::ToString() // cast isn't here 
IL_0011: pop 
IL_0012: ret 
} // end of method Program::Main 

如果你是拳擊的整數

int i = 1; 
object iBox = i; 

發出:

.locals init (
    [0] int32 i, 
    [1] object o 
) 

IL_0000: nop 
IL_0001: ldc.i4.5 
IL_0002: stloc.0 
IL_0003: ldloc.0 
IL_0004: box [mscorlib]System.Int32 
IL_0009: stloc.1 
IL_000a: ret 

通知的box運碼。如果你不確定是否裝箱或取消裝箱,你可以查看IL並查看這個操作碼是否在那裏。

如果你拆箱整數:

int j = (int) iBox; 

過程可用於其他類型的值,如booldouble相似。

0

將數據分配給對象數據類型時發生裝箱。既然你沒有這樣做,那就不是裝箱或拆箱。

0

拳擊被用於轉換值類型(除了字符串)到對象類型 使用的ToString()爲拳擊 取消裝箱方法被用於轉換的對象類型來引用類型(字符串) 使用anydatatype(除了字符串).parse( )方法