C#之装箱和拆箱

简介:   

     我们都知道,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)


   1、在堆上分配一个内存空间,大小等于需要装箱的值类型对象的大小加上两个引用类型对象都拥有的成员:类型对象指针和同步块引用。

   2、把堆栈上的值类型对象复制到堆上新分配的对象。

   3、返回一个指向堆上新对象的引用,并且存储到堆栈上被装箱的那个值类型的对象里。


注:这个步骤不需要我们自己编写,任何装箱的地方,编译器会自动加上执行以上功能的IL代码。

   

拆箱:


int val = 100; 
object obj = val; 
int num = (int) obj; 
Console.WriteLine ("num: {0}", num); 


这是拆箱的过程,将值类型转换成引用类型,再由引用类型转换成值类型的过程。

注:被装过箱的对象才能被拆箱。

详细步骤(unbox)

 

 1、获取已装箱的对象的地址

 2、将值从堆上的对象中复制到堆栈上的值变量中


拆装箱的优缺点:

     每次装箱需要在堆中new一个新的对象,当量特别大时会影响程序的效率,拆箱过程对性能损耗较小。


总结:

    看C#视频的时候接触过装箱和拆箱,当时不是很理解,最近看.net之美的时候看到这部分终于有点共鸣了,学习真的是一个反复的过程,需要慢慢吸收。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值