简介:
我们都知道,C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值类型的实例,要么是引用类型的实例。
值类型和引用类型之间的转换称为装箱和拆箱。
装箱:值类型转换为引用类型。
拆箱:引用类型转换为值类型。
在详细介绍装箱和拆箱之前,先总结一下什么是值类型和引用类型?
值类型、引用类型:
值类型和引用类型都继承System.Object,引用类型直接从System.Object继承,而值类型则继承其子类,即直接继承System.ValueType。
值类型:
引用类型:
数组:(派生于System.Array)数组的元素,不管是引用类型还是值类型,都存储在托管堆上;
类:class(派生于System.Object);
接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。);
委托:delegate(派生于System.Delegate);
object:(System.Object的别名);
字符串:string(System.String的别名)。
装箱:
int val = 100;
object obj = val;
Console.WriteLine (“对象的值 = {0}", obj);
这是一个装箱的过程。详细步骤(box)
2、把堆栈上的值类型对象复制到堆上新分配的对象。
3、返回一个指向堆上新对象的引用,并且存储到堆栈上被装箱的那个值类型的对象里。
注:这个步骤不需要我们自己编写,任何装箱的地方,编译器会自动加上执行以上功能的IL代码。
拆箱:
int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine ("num: {0}", num);
注:被装过箱的对象才能被拆箱。
详细步骤(unbox)
1、获取已装箱的对象的地址
2、将值从堆上的对象中复制到堆栈上的值变量中
拆装箱的优缺点:
每次装箱需要在堆中new一个新的对象,当量特别大时会影响程序的效率,拆箱过程对性能损耗较小。
总结:
看C#视频的时候接触过装箱和拆箱,当时不是很理解,最近看.net之美的时候看到这部分终于有点共鸣了,学习真的是一个反复的过程,需要慢慢吸收。