装箱和拆箱

前言

    学习的过程中,总会遇到很多易混的概念,像什么线程、进程。并发、并行。装箱、拆箱。真所谓无困难,不学习,所以小编特来总结装箱和拆箱,分享给大家!


概念

    在介绍装箱和拆箱前,我们必须要清楚几个与此有关的重要概念。

    堆可以看做是一棵倒挂的树,如堆排序。 它由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。它是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度相对要低一些。

   是一种先进后出的数据结构,由操作系统自动分配释放,存放函数的参数值,局部变量的值等。类似于数据结构中的栈。采用一级缓存,通常都是被调用时处于存储空间中,调用完直接释放。

值类型

    值类型主要由两类组成:结构、枚举。结构分为以下几类:
    1、整型(Sbyte、Byte、Char、Short、Ushort、Int、Uint、Long、Ulong)
    2、浮点型(Float、Double)
    3、decimal
    4、bool
    5、用户定义的结构(struct)。

引用类型

    包括类、接口、委托、数组以及内置引用类型object与string。

四者关系

    值类型是在栈中分配内存,在声明时初始化才能使用,不能为null。值类型超过作用范围系统会自动释放内存。

    引用类型在堆中分配内存,初始化时默认为null。引用类型是通过垃圾回收机制进行回收。


怎么来的

    清楚上述概念后,那为什么要用拆箱和装箱,他们从哪里来的啊?

    NET包含一个特殊的Object类,可以接受任意的数据类型的值,当所传递或所赋值的类型不是一个特定的数据类型时,object类就提供了一种传递参数和赋值的通用方法。赋给object的值必须作为引用类型,并存放砸托管堆中。所以值类型和引用类型的值可以通过显式(或隐式)操作相互转换,而这转换过程也就是装箱(boxing)和拆箱(unboxing)过程。


是什么

装箱:值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。

拆箱   是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换


怎么做

装箱: 对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。按三步进行。
第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个SyncBlockIndex)。
第二步:将值类型的实例字段拷贝到新分配的内存中。
第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。


拆箱:检查对象实例,确保它是给定值类型的一个装箱值。将该值从实例复制到值类型变量中。


影响

装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低。

解决办法:1、通过重载函数来避免。2、通过泛型来避免。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值