黑马程序员技术交流社区

标题: 拆箱和装箱 [打印本页]

作者: 邓江红    时间: 2014-4-1 13:30
标题: 拆箱和装箱
装箱和拆箱的具体应用?
作者: cmcm2014    时间: 2014-4-1 13:33
你是想问装箱拆箱在C#里面的应用么?
我想到的是:调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。
还有一种是:一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。

作者: Max_骏    时间: 2014-4-1 17:09
装箱是将值类型转换为 object 类型或由此值类型实现的任何接口类型的过程。  当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。 取消装箱将从对象中提取值类型。 装箱是隐式的;取消装箱是显式的。 装箱和取消装箱的概念是类型系统 C# 统一视图的基础,其中任一类型的值都被视为一个对象。

装箱例子:int i = 123;
// The following line boxes i.
object o = i;  

取消装箱例子:
o = 123;
i = (int)o;  // unboxing

装箱用于在垃圾回收堆中存储值类型。 装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。 对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。

取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。 取消装箱操作包括:
1、检查对象实例,以确保它是给定值类型的装箱值。

2、将该值从实例复制到值类型变量中。

作者: shangxin    时间: 2014-4-1 18:54
装箱就是把值类型转换成引用类型,拆箱反之。
比如:
int a=0;
object obj=a;
Console.WriteLine("对象的值={0}",obj);
int b;
b=(int)obj;
Console.WriteLine("b的值={0}",b);
-----------------------------------
上面就是装箱和拆箱的操作。

它在value-type 和reference-type之间的架起了一座桥梁,使得任何value-type的值都可以转换为object类型的值,反过来转换也可以。装箱和拆箱使我们能够统一地来考察类型系统,其中任何类型的值最终都可以按对象处理。

C#中应该尽量避免装箱和拆箱操作,因为这样会对性能造成一定的影响。

装箱和拆箱:任何值类型、引用类型可以和object(对象)类型之间进行转换。装箱转换是指将一个值类型隐式或显式地转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型(interface-type)。把一个值类型的值装箱,就是创建一个object实例并将这个值复制给这个object,装箱后的object对象中的数据位于堆中,堆中的地址在栈中。被装箱的类型的值是作为一个拷贝赋给对象的。
拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口地值类型。注意装箱操作可以隐式进行但拆箱操作必须是显式的。拆箱过程分成两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2