书上说:装箱和拆箱是对值类型和引用类型之间的互操作,自从有了泛型,这个开销较大的事情尽量少做。
问题是:自定义了一个类MyClass, 然后自己实例化为MyClassInstance, Object container = MyClassInstance;这个操作是装箱么? 如果是,如何解释“值类型和引用类型的互操作”,两个不都是引用类型么?

解决方案 »

  1.   

    首先你要弄清楚值类型和引用类型的区别
    值类型实例分配在堆栈上,它的变量本身就包含了实例数据,而引用类型分配在托管堆上,里面包含的是实例数据
    的内存引用。一个包含的是值本身,一个是包含的是值的引用。他们之间的转换才叫装箱和拆箱。
    值类型和引用类型都是从object继承而来。
    你举的这个例子没有发生上述行为。
      

  2.   

    (stack) 栈上,引用类型分配在托管堆(managed heap)
    特殊情况下会有出入,比如说当一个类里面定义了值类型。
      

  3.   

    box:值类型到引用类型。
    unbox:引用类型到值类型。box:object a = 123;unbox:int i = (int)a;通过泛型可以指定容器元素类型,因此可以减少这方面的性能损耗。
    如果是ArrayList之类的容器值类型只能转换成引用类型。
      

  4.   

    路過順便問個問題,
    如果是在這種情況下:
    自定義1个MyClass类然后
    MyClass class = new MyClass();ArrayList al = new ArrayList();
    List<MyClass> list = new List<MyClass>();那把一堆MyClass的实例放到al和list里面, 在性能方面是不是一样呢
      

  5.   

    以前也是以为,大转小就是拆箱,如上逻辑。实际上不是这样,我举的例子刚好可以反驳这个,两个引用之间的互相转换(基类和子类之间的互转)未必都是装箱和拆箱。可能大家在使用上,已经约定俗成地称这种现象叫“装箱/拆箱”,严格定义上讲,只发生在值类型和引用类型之间的转换。就好像大家都解释道 堆栈和堆的区别一样。原理大家都知道,不知道生活中这种笼统的装箱拆箱叫法是否符合愿意。分析例子让大家:
    基类Object    container   =  子类MyClass的实例Instance
    将子类的instance装入Object,就是小装大,两个都是引用类型,这样的行为可以叫做“装箱”么? 大家不用再讨论 堆栈和堆的关系。