简朴的来讲:
装箱就是值范例转换为援用范例;
拆箱就是援用范例转换为值范例。
值范例,包含原范例(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、罗列 (enum) 、构造 (struct)。
援用范例包含类、数组、接口、托付、字符串等。
装箱:值范例到援用范例或到此值范例所完成的任何接口范例的隐式转换
比方: int temp = 3;
System.Object obj = temp;
个中,temp为值范例,在栈中分派;当分派obj这个援用范例时,我们须要在堆中分派一个obj对象,然后把temp值赋给它,这么一系列的历程就是装箱的历程。
拆箱:从援用范例到恣意值范例的显式转换。与装箱差别,拆箱式显示转换。
比方:int temp = 3;
System.Object obj = temp;
int i = (int) obj;
拆箱历程当中,起首来肯定对象obj为一个值范例的装箱值,然后把值赋给值范例。
隐式转换总会胜利的状况,不会抛出非常:
(1)、从派生类到基类;
(2)、从派生接口到基接口;
(3)、从类到接口(该类完成了接口);
(4)、从Null到任何类;
显式援用转换,以下能够抛出非常,转换不一定胜利:
(1)、从基类到派生类;
(2)、从接口到接口(基接口到派生接口或许俩接口没有关系);
(3)、从接口到类(该类完成了该接口或该类未关闭);
(4)、从类到接口(该类未完成该接口且该类未关闭);
上面简朴的引见了拆箱和装箱的定义,下面就来讨论一下装箱和拆箱与堆和栈如何运用
个中值范例是在栈中分派内存,自身的声明就是一个初始化的历程,其不须要举行垃圾接纳,只需超越所定义的作用局限会自动开释内存,而援用范例则是在堆中分派的,和java一样,在堆种分派内存,而其托管堆举行垃圾接纳。当两种数据范例举行转换时就引出了装箱/拆箱。
比较装箱和拆箱的优缺点
装箱和拆箱虽然满足了两只范例之间的转换。然则从装箱的历程当中不难看出,每次装箱时要在堆中new一个新的对象,当量迥殊大是肯定会大大影响顺序的效力。事物总有两面性,every sword has two sides,事变便简朴了,机能也下来了。所以,在运用中,我们应当只管防止装箱操纵。
了解了装箱和拆箱的操纵,我们能够清楚的邃晓:装箱操纵会致使数据在堆和栈上举行拷贝,频仍的装箱操纵会机能丧失。而比拟而言拆箱历程对机能消耗照样比较小的。
装箱和拆箱的细致步骤
1、装箱(box)的细致步骤:
(1)、在堆上分派一个内存空间,大小即是须要装箱的值范例对象的大小加上两个援用范例对象都具有的成员:范例对象指针和同步块援用。
(2)、把客栈上的值范例对象复制到堆上新分派的对象。
(3)、返回一个指向堆上新对象的援用,而且存储到客栈上被装箱的谁人值范例的对象里。
这个步骤不须要顺序员本身编写,在任何涌现装箱的处所,编译器会自动加上实行以上功用的IL代码。
所谓的拆箱就是装箱对应着的观点,但拆箱的历程和装箱并非倒过来就是:
2、拆箱(unbox.any)的细致步骤
假如为待拆箱对象为null,抛出NullReferenceException非常。
假如援用指向的不是一个希冀对象的已装箱对象,抛出InvalidCastException非常。
(1)、猎取已装箱对象中各个字段的地点,这个历程就是“拆箱”
须要申明的是平常拆箱以后会伴随着对象的拷贝,但拷贝操纵已不是拆箱的领域。
下面举两个小的例子来完成什么是装箱、拆箱以及如何防止因频仍的装箱而消耗内存
(1)、装箱:
using System; public class Test { public static void Main(String[] args) { int i = 10; //将值范例的i装箱 //须要注重的是:这里的装箱采纳的是值的拷贝 object obj = i; //磨练是不是装箱胜利了 if(obj is int) { Console.WriteLine("数据已装箱!"); } //我们在这里变动i的值 i = 33; Console.WriteLine("int i如今的值是:{0}",i); Console.WriteLine("int i装箱的值是:{0}",obj); } }
(2)、拆箱:
int i = 10; object obj = i; int j = (int)obj; (3)、防止频仍的装箱: int i = 10; int j = 20; int s = 30; Console.WriteLine("i的值为{0},j的值为{1},s的值为{2}", i.ToString(), j.ToString(), s.ToString());
以上就是引见了C#的装箱与拆箱,思绪很清楚,触及的内容很周全,包含装箱和拆箱的优缺点、装箱和拆箱的步骤等,很合适初学者举行进修。
更多轻松进修C#的装箱与拆箱相干文章请关注ki4网!