比如一个类中实例化的一个  
int[]  x=new  int[2]{1,2};
里面的每个整型数都存在堆栈中还是堆中??  如果在堆中可以存储值类型变量,那装箱就不需要在栈中创建值类型变量了啊

解决方案 »

  1.   

    里面的每个整型数都存在堆栈中还是堆中??  
    ========================================
    里面的整数是存在于堆中
    一般来说如果值类型为引用类型的一部分,它就内置于堆中,即包含在引用类型的数据中。(C#高级编程)如果在堆中可以存储值类型变量,那装箱就不需要在栈中创建值类型变量了啊
    =====================================================================
    首先指正下,这句话是不是写反了?是拆箱?
    装箱和拆箱是.net中为了实现引用类型和值类型之间转换的产物,因为你这种类型的存储方式不一致,也可以说是瀑布得以而这样做的,好像你理解的方向不对。
      

  2.   

    如果在堆中可以存储值类型变量,那装箱就不需要在栈中创建值类型变量了啊
    这个问题其实可以深究另外,微软使用了一个新的名词字段(Field)来描述我们以前所称呼的成员变量,所以准确的描述是,类型的字段随实例储存,引用类型的字段随实例储存在托管堆上,即使字段的类型是值类型的。
    回到楼主的问题,其实楼主说的不无道理,值类型可以存在托管堆上,那么访问他的时候为什么不直接操作托管堆上的数据而要拷贝到堆栈上(拆箱)来修改。猜测是因为值类型的变量(变量与字段不同)的问题,在CLR里面,值类型的变量必须是保存在堆栈上。而实际上不拆箱,直接在托管堆上对值类型进行操作也是可以的,通过反射即可。
      

  3.   

    呵呵
    其实都是,gc 和 .net 阉割了指针惹的祸
      

  4.   

    4楼说的我有点晕,我以为装箱拆箱只有在 object o = 5;这种情况下发生。没想到过类的字段也存在装箱这一说,更没想到过操作类的字段还要拆箱到堆栈上再用。