c#中的装箱与拆箱
装箱:【值类型】转换为【引用类型】。
拆箱:【引用类型】转换为【值类型】。
如果只是单一的一个类型的变换是不发生装箱与拆箱。
例如:
// Student是Person的子类
Student s =new Student();
Person p = s;
Student std = (Student)p; //两种都是引用类型
int num1 = 2;
double num2 = num2;//因为两种都是值类型
上面两种情况与其类似的都是不会产生装箱与拆箱的。
那么在代码中究竟哪些是拆箱与装箱呢?
int num = 2;
object oj = num;//装箱
int num2 = (int)oj;//拆箱
还有一些特殊的情况
例如:
1.
int num = 2;
object obj = n;//发生了装箱
double num2 = (double)obj;//拆箱
上述情况虽然发生了装箱与拆箱但是被并不能运行,因为装箱时是什么类型拆箱时也要是什么类型,所以double必须换为int类型的。
2.
int num = 2;
string str = Convert.ToString(num);
int num2 = int.Parse(str);
string 是引用类型的 int是值类型的,按理来说这应该发生了装箱与拆箱,其实不然。
装箱与拆箱要求是两种类型是有继承关系的,但是上面的情况int与string是没有关系的。
3.
string s1 = "mm";
string s2 - "nn";
int num = 20;
string s3 = string.Concat(s1,s2,num);
这种情况发生了装箱与拆箱,这个看似和上面的相同其实不是,这个圆括号里的重载有很多种,这个调用的是params object [];因此会发生一个 num 转换成引用类型。s1,s2就是引用类型所以不用转。
装箱与拆箱会发生大量的性能消耗,因此我们要尽量避免装箱与拆箱。
那么到底在那一部分会经常发生装箱与拆箱呢?
集合类。
ArrayList
会发生大量的装箱与拆箱,这也是不用它的原因之一。
推荐使用List<>;