具有引用类型变量的对象类型装箱

拳击是指将值类型分配给对象类型。 将引用类型分配给对象时是否相同?

如果分配了一个类型(不是对象),会发生什么? 那个拳击呢?

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

我认为你的意思是

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

这是有效的,因为System.String与所有其他类一样,派生自System.Object

 public sealed class String : Object { ... } 

拳击是指将值类型分配给对象类型。

关。 当值类型的值 转换引用类型时,会发生“Boxing”。

将引用类型的值赋给对象类型的变量时是否相同?

不会。当值类型的值转换为引用类型时,就会发生Boxing。 将引用类型的值转换为对象不是装箱转换,它是引用转换。

当引用类型(不是对象)的值被赋给对象类型的变量时,会发生什么?

引用类型的值是引用 。 将引用分配给object类型的变量时,将在与该变量关联的存储位置中创建引用的副本。

那个拳击呢?

不会。当值类型的值转换为引用类型时,就会发生Boxing。 将引用类型的值转换为对象不是装箱转换,它是引用转换。

Boxing正在堆栈上创建一个对象引用,它引用堆上的类型值例如int。 但是当一个引用类型(女巫不是对象)分配给对象时,它不是拳击。

Eric的答案对应于CLI(公共语言基础结构)标准ECMA-335 ,分区I(体系结构),第5章(术语和定义),它将装箱定义为:“将具有某种值类型的值转换为新分配的值”引用类型System.Object的实例。“,并取消装箱为:”将类型为System.Object的值(其运行时类型为值类型)转换为值类型实例。“

CIL(通用中间语言)的box和unbox指令的行为与此类似,这也是在C#或VB.NET上下文中提到装箱/拆箱时通常隐含的含义。

然而,术语装箱拆箱有时用于更广泛/实用的意义上。 例如,F# box和unbox运算符可以对System.Object进行值类型引用类型的转换:

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

将提供的代码编译成工作的可执行文件并反汇编它会显示第一个赋值( obj )的显式框指令,该指令不存在于第二个( obj2 ):

资源

 namespace BoxingAndTypeConversion { class Program { public class MyClass { } static void Main(string[] args) { int num = 5; object obj = num; //boxing ////////////////////// MyClass my = new MyClass(); object obj2 = my; //what is name this convert (whethere is boxing?) } } } 

CIL

 .method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 19 (0x13) .maxstack 1 .locals init ([0] int32 num, [1] object obj, [2] class BoxingAndTypeConversion.Program/MyClass my, [3] object obj2) 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: newobj instance void BoxingAndTypeConversion.Program/MyClass::.ctor() IL_000f: stloc.2 IL_0010: ldloc.2 IL_0011: stloc.3 IL_0012: ret } // end of method Program::Main