[英]Object type boxing with a reference type variable
装箱是将值类型分配给对象类型时。 将引用类型分配给对象时是否相同?
分配类型(不是对象)后,会发生什么? 那个拳击也是吗?
int num=5;
object obj = num; //boxing
//////////////////////
MyClass my = new MyClass();
object obj = my; //what is name this convert (whethere is boxing?)
装箱是将值类型分配给对象类型时。
关。 当值类型的值 转换为引用类型时, 将发生“装箱”。
将引用类型的值分配给类型对象的变量是否相同?
否。将值类型的值转换为引用类型时会发生装箱。 将引用类型的值转换为对象不是装箱转换,而是引用转换。
当引用类型的值(不是对象)被分配给对象类型的变量时,会发生什么?
引用类型的值是reference 。 将引用分配给类型对象的变量时,将在与该变量关联的存储位置中创建引用的副本。
那个拳击也是吗?
否。将值类型的值转换为引用类型时会发生装箱。 将引用类型的值转换为对象不是装箱转换,而是引用转换。
我想你的意思是
string s = "hello";
object x = s; // no boxing, just implict conversion to base-type.
之所以System.String
,是因为System.String
与所有其他类一样,都是从System.Object
派生的:
public sealed class String : Object { ... }
装箱法在堆栈上创建一个对象引用,该对象引用在堆上引用例如int类型的值。 但是,当引用类型(女巫不是对象)分配给对象时,它不是装箱。
埃里克(Eric)的回答与CLI(通用语言基础结构)标准ECMA-335的分区I(体系结构)的第5章(术语和定义)相对应,其将装箱定义为:“将具有某种值类型的值转换为新分配的值引用类型为System.Object的实例。”,并装箱为:“将类型为System.Object的值(其运行时类型为值类型)转换为值类型实例。”
CIL(通用中间语言)的装箱和拆箱指令的行为是这样的,这也是在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.