2012-02-01 160 views
4

拳擊是當值類型被分配給的對象類型。引用類型分配給對象時是否一樣?與參考類型對象類型拳擊可變

當類型(其不是對象)被分配,會發生什麼情況?那是拳擊嗎?

int num=5; 
    object obj = num; //boxing 
    ////////////////////// 
    MyClass my = new MyClass(); 
    object obj = my; //what is name this convert (whethere is boxing?) 
+0

添加一個例子更加清晰。請檢查並清潔您的[Enter]和[Spacebar]鍵。 – 2012-02-01 08:45:27

+0

像亨克說的那樣,所有類型都是對象,並且引用類型仍然存儲在堆中。 – Jodrell 2012-02-01 08:58:25

回答

7

我假定你的意思是這樣

string s = "hello"; 
object x = s;  // no boxing, just implict conversion to base-type. 

這工作,因爲System.String,像所有其他類,從System.Object派生:

public sealed class String : Object { ... } 
+0

謝謝你henk。 – 2012-02-01 08:54:18

2

拳擊正在創建一個對象引用,在堆棧,它引用了例如類型的值int,在堆上。但是,當一個引用類型(女巫不是對象)分配給對象時,它不是裝箱。

+2

爲什麼參考必須放在堆棧上?不能將參考文件放在堆上或寄存器中嗎? – 2012-02-01 16:24:54

16

拳擊是當值類型被分配給的對象類型。

關閉。 「拳擊」發生時值類型的值是轉換引用類型

是否將引用類型的值分配給類型爲object的變量時是否一樣?當值類型的值被轉換爲引用類型

號拳擊發生。將引用類型的值轉換爲對象不是裝箱轉換,而是參考轉換。

當(其不是對象)引用類型的值被分配給對象的類型的變量,會發生什麼情況?

參考類型的值是參考。當一個引用被分配給一個對象類型的變量時,引用的一個副本將在與該變量相關聯的存儲位置中進行。

是拳擊嗎?當值類型的值被轉換爲引用類型

號拳擊發生。將引用類型的值轉換爲對象不是裝箱轉換,而是參考轉換。

1

Eric的答案對應於CLI(通用語言基礎結構)標準ECMA-335,分區I(體系結構),第5章(術語和定義),其定義了裝箱爲:「將具有某種值類型的值轉換爲新分配的引用類型System.Object的實例「,並將其拆箱爲:」將具有System.Object類型的值(其運行時類型爲值類型)的值轉換爲值類型實例。「

的CIL(公共中間語言)的箱和拆箱指令這樣的表現,這也是拳擊發言/拆箱中的C#或VB.NET上下文時通常所隱含的意思。

然而,術語拳擊拆箱在更寬/務實感有時被用於例如,F#box和拆箱運營商可以做值類型引用類型並從System.Object的轉換:

> let o = box "Hello World";; 
val o : obj = "Hello World" 
> let s:string = unbox o;; 
val s : string = "Hello World"