黑马程序员—C#中装箱和拆箱的问题

来源:互联网 发布:数据免费恢复软件 编辑:程序博客网 时间:2024/06/05 01:07

----------------------   Windows Phone 7手机开发 .Net培训    期待与您交流! ----------------------

前言:下面先看一段程序,通过程序来引入拆箱和装箱的概念:

1.装箱

int i=42;

Object o=i;

i=50;

Console.WriteLine(“i={0},o={1}”,i ,o);//输出为i=50,o=42

下面分析一下为什么会是这个结果。

实际情况是:首先从内存堆栈中分配一小片内存,来存储int类型的数据42,然后再分配一小片内存来存储一个引用o。接着在内存堆中分配一片内存,将i中值的一个副本存在在该内存中。最后让i的引用指向这个副本。这种将一个数据项从堆栈自动复制到堆得行为成为装箱(Boxing)。

若修改一个变量的原始值,不会修改堆上现有的值,因为它只是一个副本。

先将图附上,方便理解:

2.拆箱

   int i=42;

   object o=i;//装箱

   i=(int)o;//成功编译,为了访问已装箱的值,必须进行一次强制类型转换。

   编译器发现指定了类型int,所以在运行时生成代码来检查o实际引用的时什么,它能引用任何东西。假如o真的引用一个已装箱的int,而且一切条件都满足强制类型转换,就会成功执行,编译器生成的代码会从装箱的int中提取出值,这个过程成为拆箱。

  如果o没有引用一个已装箱的int,就会出现类型不配的情况,造成强制类型转换失败。

  Circle c=new Circle(42);

  Object o=c;//不装箱,Circle是一个类

  int i=(int)o;//编译成功,但是在运行时会抛出异常,抛出InvalidCastException异常

拆箱时指定的类型必须与装箱的类型完全一致,假定装箱时容纳的是一个int值的副本,并试图拆箱成一个long,就会抛出异常,虽然隐式类型转换能将int转换成long,但这个约定在这是不成立的。注意:拆箱时类型必须完全匹配。

以上就是我对拆箱和装箱的浅见。

 

----------------------   Windows Phone 7手机开发 .Net培训    期待与您交流! ----------------------

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驱动都被卸载了怎么办 电脑密码忘了怎么办w7旗舰版 笔记本电脑密码忘了怎么办w7 windows一键还原了怎么办 戴尔笔记本电脑键盘没反应怎么办 win10电脑系统盘满了怎么办 win7玩dnf卡死怎么办 cf老是卡住闪退怎么办 w7系统帐户被停用怎么办 海康硬盘录像机密码忘了怎么办 电信合约套餐到期后怎么办 电脑更新系统卡住了怎么办 格力空调显示e1怎么办 ae崩溃了没保存怎么办 电脑下面的状态栏没了怎么办 游戏32位不兼容怎么办 电脑开机dos红屏怎么办 win7进入dos红屏怎么办 手机玩游戏屏幕卡住不动怎么办 魔域英文版换中文版怎么办 党员培养期不足一年怎么办 出生证明日期错了怎么办 毕业生登记表写错了怎么办 高等学校毕业生登记表写错了怎么办 眼睛里迷了东西怎么办 眼睛迷了怎么办小绝招 isf货物离港申报怎么办 非农户口没住房怎么办 在工厂上班很累怎么办 退货运费太贵了怎么办 悬肘写字手抖怎么办 护士成绩合格证明丢了怎么办 找工作真难找好烦怎么办 大夫说身体不适合怀孕有了怎么办 不知道要做什么工作怎么办 红米note4x闪退怎么办 魅蓝note3闪退怎么办 红米note2闪退怎么办 安卓不支持计步怎么办 银行多扣了钱怎么办 网络配置器没了怎么办