问题比较多,一个一个问了,呵呵。
装箱操作:
int i = 123;    //在堆栈上分配空间给i;
object o = (object) i;//此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。问:
将i装箱后,变量i还在原堆栈上吗?
对像o是堆栈上还是堆上创建啊?

解决方案 »

  1.   

    这里最好把堆和栈分开来说
    int i是在栈上分配的值类型
    object o 是在堆上分配的引用类型
    i的装箱操作不会影响i本身,只是在堆上新建了一个对象
    o自然是在堆上创建的
      

  2.   

    问题比较多,一个一个问了,呵呵。
    装箱操作:
    int i = 123;    //在堆栈上分配空间给i;
    object o = (object) i;//此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。问:
    将i装箱后,变量i还在原堆栈上吗?
    对像o是堆栈上还是堆上创建啊?
    问题比较多,一个一个问了,呵呵。
    装箱操作:
    int i = 123;    //在堆栈上分配空间给i;
    object o = (object) i;//此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。问:
    将i装箱后,变量i还在原堆栈上吗?
    对像o是堆栈上还是堆上创建啊?
    问题比较多,一个一个问了,呵呵。
    装箱操作:
    int i = 123;    //在堆栈上分配空间给i;
    object o = (object) i;//此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。问:
    将i装箱后,变量i还在原堆栈上吗?
    对像o是堆栈上还是堆上创建啊?
    问题比较多,一个一个问了,呵呵。
    装箱操作:
    int i = 123;    //在堆栈上分配空间给i;
    object o = (object) i;//此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。问:
    将i装箱后,变量i还在原堆栈上吗?
    对像o是堆栈上还是堆上创建啊?
    问题比较多,一个一个问了,呵呵。
    装箱操作:
    int i = 123;    //在堆栈上分配空间给i;
    object o = (object) i;//此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。问:
    将i装箱后,变量i还在原堆栈上吗?
    对像o是堆栈上还是堆上创建啊?
    问题比较多,一个一个问了,呵呵。
    装箱操作:
    int i = 123;    //在堆栈上分配空间给i;
    object o = (object) i;//此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。问:
    将i装箱后,变量i还在原堆栈上吗?
    对像o是堆栈上还是堆上创建啊?
    问题比较多,一个一个问了,呵呵。
    装箱操作:
    int i = 123;    //在堆栈上分配空间给i;
    object o = (object) i;//此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。问:
    将i装箱后,变量i还在原堆栈上吗?
    对像o是堆栈上还是堆上创建啊?
    问题比较多,一个一个问了,呵呵。
    装箱操作:
    int i = 123;    //在堆栈上分配空间给i;
    object o = (object) i;//此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。问:
    将i装箱后,变量i还在原堆栈上吗?
    对像o是堆栈上还是堆上创建啊?
      

  3.   

    谢谢 fancyf(凡瑞) .
    但是在.net集成的帮助里找“装箱”所看到的示图,
    意思是对象O是在栈上创的,只是指向堆上的值123.这是怎么回事啊?
      

  4.   

    根据fancyf(凡瑞)的意思:
    取消装箱:
    int i = 123;          // A value type
    object o= i;       // Boxing
    int j = (int)o;     // Unboxing那么取消装箱后,在堆上的装箱变量i是不会消失了,只是在栈上多了个j值类型。
      

  5.   

    o是一个引用类型,不可能在栈上创建,它一定是在Manage heap,即托管堆上创建的
    int i也不可能在堆上
      

  6.   

    int i = 123;          // A value type
    object o= i;       // Boxing
    int j = (int)o;     // Unboxing
    在超出o的作用域前o还存在,并没有立即消失,但是j是被复制出来的
      

  7.   

    但是在.net集成的帮助里找“装箱”所看到的示图,
    意思是对象O是在栈上创的,只是指向堆上的值123.这是怎么回事啊?
      

  8.   

    我把帮助上的原话粘在这里:请看以下值类型变量的声明:int i = 123;
    以下语句对变量 i 隐式应用装箱操作:object o = i;
    此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 i 和 o 之间的差异。//你看这句话,说在堆栈上创建对像o!!!!装箱转换图
      

  9.   

    我这个帮助不是网上的,是安装.net framework 时装的。
    你只要启动.net 程序。按F1然后搜索"装箱"就可以看到图了。
      

  10.   

    我把它传到我的空间了,你可以看一下:http://www.telus.cn/a.html   //装箱
    http://www.telus.cn/b.html   //拆箱
      

  11.   

    哦,我也找到英文的了
    文章的意思是说o是一个指针,指针本身是在栈上的,他存放的是堆上的一块内存的地址,这块内存是o所指向的对象所占用的真正的内存,栈上的o只是一个指针,不是对象本身。
      

  12.   

    恩,这么说装箱时,是在栈上放了个指针o ,指向堆上的数据。
    堆上一般放引用类型,如对象。
    栈上一般放值类型。
    那有没有例外呢?还有就是那个该死的装配件。
    我有个老的组件,有其它组件依赖这个组件。现在我想重写这个dll.
    如何在不影响其它依赖这个dll的组件呢?直接把新写的dll覆盖掉老的dll吗?
    装配件到底能做什么事情?
      

  13.   

    引用类型所占用的内存一定在堆中,值类型一定在栈中,没有例外,这也是值类型和引用类型的本质区别之一要不影响其它依赖这个dll的组件起码要保证重写的dll的接口根以前的完全一样,要是用了强名称的话所有相关的组件都要重新编译
      

  14.   

    非常感谢fancyf(凡瑞) 
    那装配件好像不能解决组件版本冲突的问题?
      

  15.   

    要解决版本冲突必须用强名称,而且最好放在GAC中
      

  16.   

    那我现在有两个不同版本的dll。也就是说这个两个不同版本的dll.一个也不能删除。并且要放到GAC中。
      

  17.   


    Gacutil /i <assembly_path>
    来分别注册两个程序集
      

  18.   

    再次感谢 fancyf(凡瑞)
    结贴了。