2012-02-01 86 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"