none
关于拆箱与类型转换的问题 RRS feed

  • 问题

  • 感觉拆箱与类型转换十分相似。

    我问题是:int i = 42;

                  object o = i ;

                  i = (int)o; //我知道这个是拆箱

    但如果这样做:

                  int i = 42;

                  object o = i;

                   double a =(double)o; //为什么这个拆箱动作是错的呢?

    另外,假如拆箱是一种强制类型转换行为,那根据MSDN对强制类型转换的描述——从一种类型转换为另一种类型

    拆箱是从什么类型转换为什么类型?

    (按照网上一些资料的说法,以上面代码为例。拆箱只能将object类型转换为int类型)

    那这又有另外一个问题:

    int i = 42;

    double j = (double)i; //也可以是 string j = (string)i;

    这也是类型转换,为什么这里的int 类型可以转换为double 或者是 string 呢?

    我想有必要向个位大大请教一下 拆箱时内存的操作情况 ,可以的话尽量用大白话解释吧,我承认我是小白,看不懂专业术语。

    2012年7月30日 5:49

答案

  • 值类型直接存储在栈中,而”引用类型“分两块存储:

    1)引用类型的指针(引用类型变量名称)存储在栈中。

    2)引用类型指针指向的实际实体存储在堆中。

    object是引用类型,那么指向一个值类型。此时值类型需要拷贝一份到堆中,然后object指向它。拆箱的时候同样要把在堆上的值类型拷贝回到栈上,然后方可使用。

    你的理解正确的!


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 lolanto 2012年7月31日 12:58
    2012年7月31日 2:22
    版主
  • dear

    因为你先将 int 放到object里(装箱),再把object转成double(拆箱),这会导致"强制转型"失败,改成以下就不会失败

    int i = 42;
    object o = i;
    double a = Convert.ToDouble(o);
    

    拆箱就是将一个"引用型"对象转换成任意"值类型",比如:
    int i=0;
    System.Object obj=i;
    int j=(int)obj;

    拆封箱你可参考以下

    http://www.cnblogs.com/xiaoshi/archive/2008/05/28/1208902.html


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已标记为答案 lolanto 2012年7月31日 12:58
    2012年7月30日 6:55

全部回复

  • dear

    因为你先将 int 放到object里(装箱),再把object转成double(拆箱),这会导致"强制转型"失败,改成以下就不会失败

    int i = 42;
    object o = i;
    double a = Convert.ToDouble(o);
    

    拆箱就是将一个"引用型"对象转换成任意"值类型",比如:
    int i=0;
    System.Object obj=i;
    int j=(int)obj;

    拆封箱你可参考以下

    http://www.cnblogs.com/xiaoshi/archive/2008/05/28/1208902.html


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已标记为答案 lolanto 2012年7月31日 12:58
    2012年7月30日 6:55
  • 楼上的大大,我想问下:

    EG:        int i = 42;

                  object o = i ;

                  i = (int)o;

    我所理解的是 o 引用了 i 的一个副本,该副本位于堆中,副本内有一个 int 类型的值42

    当我要强制转换类型时,假如 o 引用的副本内的值不是 int 值,转型就是败。<—┐

    换言之,拆箱只能将引用副本中的值,转换成对应数据类型的值类型。<———— ┘

    是这样理解吗?

    2012年7月30日 8:39
  • 值类型直接存储在栈中,而”引用类型“分两块存储:

    1)引用类型的指针(引用类型变量名称)存储在栈中。

    2)引用类型指针指向的实际实体存储在堆中。

    object是引用类型,那么指向一个值类型。此时值类型需要拷贝一份到堆中,然后object指向它。拆箱的时候同样要把在堆上的值类型拷贝回到栈上,然后方可使用。

    你的理解正确的!


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 lolanto 2012年7月31日 12:58
    2012年7月31日 2:22
    版主