none
C#求助 RRS feed

答案

  • 您好,

    装箱就是把值类型转成引用类型。

    拆箱就是把引用类型转成值类型。

    代码说明:

    Int32 i = 1;

    Object o = i; //这个是装箱

    Int32 x = (Int32)o; //这个是拆箱

    2011年3月30日 13:45
    版主
  • 2011年3月30日 14:33
  • 准确的说,装箱 (boxing) 是指将一个值类型对象包装成包含其值得对应的引用类型,该装箱后的引用类型的类型必须是 System.Object。装箱的主要步骤是:

    1、计算需要装箱的值类型对象的大小以及需要在托管堆上需要的空间大小
    2、在托管堆上分配空间
    3、复制整个值类型对象的数据,从本地栈到托管堆上
    4、为新建立的引用对象分配 Type Pointer 和 Sync Block Index
    5、做其他需要做的一些工作,如重写 Equals, GetHashCode 等 (有一部分工作室 CLR 自动完成的比如 GetType,装箱后的 GetType 会得到原来值类型的类型,比如,将一个 Int32 装箱为 Object 后其 GetType 仍然为 Int32。这里,CLR 在撒谎)

    拆箱则反之依然。

    可以看到,装箱操作需要消耗一定的空间和 CPU 时间片,这个性能影响可以是很大的。所以,没有必要的话,尽量避免装箱/拆箱操作。

     


    Mark Zhou
    2011年3月31日 8:33

全部回复

  • 您好,

    装箱就是把值类型转成引用类型。

    拆箱就是把引用类型转成值类型。

    代码说明:

    Int32 i = 1;

    Object o = i; //这个是装箱

    Int32 x = (Int32)o; //这个是拆箱

    2011年3月30日 13:45
    版主
  • 2011年3月30日 14:33
  • 非常感谢

    2011年3月31日 1:48
  • 十分感谢,谢谢
    2011年3月31日 1:48
  • 准确的说,装箱 (boxing) 是指将一个值类型对象包装成包含其值得对应的引用类型,该装箱后的引用类型的类型必须是 System.Object。装箱的主要步骤是:

    1、计算需要装箱的值类型对象的大小以及需要在托管堆上需要的空间大小
    2、在托管堆上分配空间
    3、复制整个值类型对象的数据,从本地栈到托管堆上
    4、为新建立的引用对象分配 Type Pointer 和 Sync Block Index
    5、做其他需要做的一些工作,如重写 Equals, GetHashCode 等 (有一部分工作室 CLR 自动完成的比如 GetType,装箱后的 GetType 会得到原来值类型的类型,比如,将一个 Int32 装箱为 Object 后其 GetType 仍然为 Int32。这里,CLR 在撒谎)

    拆箱则反之依然。

    可以看到,装箱操作需要消耗一定的空间和 CPU 时间片,这个性能影响可以是很大的。所以,没有必要的话,尽量避免装箱/拆箱操作。

     


    Mark Zhou
    2011年3月31日 8:33