C#的装箱和拆箱

装箱和拆箱最直接的意思就是装箱是把值类型变成引用类型,拆箱则是把引用类型变成值类型。

常见的值类型是:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。

常见的引用类型是:数组,用户定义的类、接口、委托,object,字符串。

无论是拆箱还是装箱都会对性能造成影响所以要尽量避免项目中的拆装箱,那么到底怎么样的叫做拆装箱呢?

int n=10;

object o=n;(装箱)

int m=(int)o;(拆箱)

在这里我们把int(值类型)变成了object(引用类型),在这个过程中就发生了装箱,然后又通过里氏转换的方法把object(引用类型强转成了值类型)发生了拆箱。

以下举一个装拆箱的反例。

我们知道字符串是引用类型,那么使用Convert的方法可以把字符串转换成int类型。

string num="123";

int a=Convert.ToInt32(num);

在这个过程中把引用类型的值变成了值类型是否发生了拆装箱呢,答案是没有发生,拆装箱有一个隐式的条件是双方具有继承关系,像之前的例子object是所有类的父类,所以是能够发生装拆箱的过程的,而string和int是两个毫无交集的类型,一个在堆上一个在栈中,他们并无继承关系因此无法发生拆装箱(PS:不是所有的继承都能发生拆装箱,但是发生拆装箱了就会有继承。)

例子:为什么大家更喜欢使用泛型list集合而不经常使用ArrayList集合呢?明明ArrayList使用起来更加的方便,想添加什么类型就添加什么类型,原因就是Arraylist添加的类型是object,而你使用Add的方法添加一个int类型在这个过程中就会发生把值类型变成引用类型的装箱,会对性能造成影响,而使用定义好的List<T>就不会有这个问题了,这就是原因。

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值