黑马程序员技术交流社区
标题: 什么是装箱和拆箱 [打印本页]
作者: 许正龙 时间: 2013-3-27 17:21
标题: 什么是装箱和拆箱
如题,装箱和拆箱在程序中有什么用处?
作者: 邓建军 时间: 2013-3-27 17:46
- 值类型。
- 值类型是在栈中分配内存,在声明时初始化才能使用,不能为null。
- 值类型超出作用范围系统自动释放内存。
- 主要由两类组成:结构,枚举(enum),结构分为以下几类:
- 整型(Sbyte、Byte、Char、Short、Ushort、Int、Uint、Long、Ulong)
- 浮点型(Float、Double)
- decimal
- bool
- 用户定义的结构(struct)
- 引用类型。
- 引用类型在堆中分配内存,初始化时默认为null。
- 引用类型是通过垃圾回收机制进行回收。
- 包括类、接口、委托、数组以及内置引用类型object与string。
概念由于C#中所有的数据类型都是由基类System.Object继承而来的,所以值类型和引用类型的值可以通过显式(或隐式)操作相互转换,而这转换过程也就是装箱(boxing)和拆箱(unboxing)过程。
- 装箱 是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。
- 拆箱(取消装箱)是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。取消装箱操作包括:
检查对象实例,确保它是给定值类型的一个装箱值。(拆箱后没有转成原类型,编译时不会出错,但运行会出错,所以一定要确保这一点。用GetType().ToString()判断时一定要使用类型全称,如:System.String 而不要用String。)
将该值从实例复制到值类型变量中。
用途像在调用Console.WriteLine()的过程中系统自动进行boxing一样,当我们在调用其它的一些方法的重载版本进行操所时,为了避免由于无谓的隐式装箱所造成的性能损失,在执行这些多类型重载方法之前,最好先对值进行装箱。一般是在处理大量数据需要对类型进行装箱操作。要掌握装箱与拆箱,就必须了解CTS及它的特点。NET重要技术和基础之一的CTS(Common Type System)。顾名思义,CTS就是为了实现在应用程序声明和使用这些类型时必须遵循的规则而存在的通用类型系统。.Net将整个系统的类型分成两大类 ——Value Type 和 Reference Type。。,多数的OO语言存在这个弱点,原因就是因为他们的原类型没有共同的基点,于是他们在本质上并不是真正的对象C++更依赖于对象,而非面向对象。.Net环境的CTS 给我们带来了方便。第一、CTS中的所有东西都是对象;第二、所有的对象都源自一个基类——System.Object类型。这就是所谓的单根层次结构(singly rooted hierarchy)关于System.Object的详细资料请参考微软的技术文档。CTS Value Type的一个最大的特点是它们不能为null,Value Type的变量总有一个值。在传递Value Type的变量时,实际传递的是变量的值,而非底层对象的“引用”。CTS Reference Type就好像是类型安全的指针,它可以为null。当值为null时,说明没有引用或类型指向某个对象。声明一个引用类型的变量时,被操作的是此变量的引用(地址),而不是数据。 使用这种多类型系统时如何有效的拓展和提高系统的性能?就是今天探讨的问题,西雅图人提出了Box and UnBox的想法。简言之,装箱就是将value type转换为reference type;反之,就是拆箱。
作者: 张振 时间: 2013-3-27 18:09
楼上太详细了 我表示压力山大 我只有翻书查看资料 手打回复了:
江值类型转换为引用类型的过程叫做装箱,相反,将引用类型转换为值类型的过程叫做拆箱。
1.装箱的例子
装箱允许将值类型隐式转化成引用类型
还是在Main方法里面
iint i = 2008;
object obj = i;
Console.WriteLine("1.i的值为{0},装箱之后的对象为{1}",i,obj);
i = 927;
Console.WriteLine("2.i的值为{0},装箱之后的对象为{1}",i,obj);
Console.ReadKey();
程序运行结果
1.i的值为2008,装箱之后的对象为2008.
2.I的值为927,装箱之后的对象为2008
拆箱例子
拆箱允许将引用类型显示转换为值类型,下面通过一个实例演示拆箱的过程
int i = 112;
object obj = i;
Console.WriteLine("装箱操作:值为{0},装箱之后的对象为{1}",i,obj);
int j = (int)obj;
Console.WriteLine("拆箱操作,装箱的对象为{0},值为{1}", obj, j);
Console.ReadKey();
程序运行后的结果
装箱操作:值为112,装箱之后对象为112
拆箱操作:装箱对象为112,值为112
作者: 许正龙 时间: 2013-3-27 19:46
邓建军 发表于 2013-3-27 17:46 值类型。
值类型是在栈中分配内存,在声明时初始化才能使用,不能为null。
谢谢科普,非常详细虽然看了还是晕晕的!~~
作者: 许正龙 时间: 2013-3-27 19:47
张振 发表于 2013-3-27 18:09
楼上太详细了 我表示压力山大 我只有翻书查看资料 手打回复了:
江值类型转换为引用类型的过程叫做装箱,相 ...
谢谢,知道是这么个操作叫做装箱,主要是不太明白这样做的意义
作者: 张振 时间: 2013-3-27 21:22
许正龙 发表于 2013-3-27 19:47
谢谢,知道是这么个操作叫做装箱,主要是不太明白这样做的意义
其实我也想得到指教 估计还没用到吧
作者: 伊廷文 时间: 2013-3-27 21:40
属于包装类范围,拆箱是把“引用”类型转换成“值”类型;装箱是把“值”类型转换成“引用类型”;就这么简单
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |