繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM