c#中的装箱与拆箱的作用和区别

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<>;

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值