装箱拆箱原理

定义

装箱是将值类型装换成引用类型的过程;拆箱就是将引用类型转换成值类型的过程;
装箱: 用于在垃圾回收堆中储存值类型。装箱是值类型到Object类型或到此类型所实现的任何接口类型的隐式转换。
拆箱: 从object类型到值类型或从接口类型到实现该接口的值类型的显示转换。
这里是值类型和引用类型的转换,不单单是父类和子类的转换

数据类型的分类

在这里插入图片描述

变量是如何存储的

我们首相要明白,值类型的变量是存储在栈上面,而引用类型是存储在堆上面

值类型存储方式

我们首先定义一个简单变量

int x=10;

我们知道,int类型存储空间是4字节(1字节=8bit);
在这里插入图片描述

我们定义x后,它会在内存开辟一个32bit的空间进行存储值。我们给x赋值是10,所以里面存储的值是1010,前面的都用0来表示。
这就是值类型存储方式,在存储中申请一个自身变量类型的存储空间进行存储数据。

引用类型存储方式

object y=10;

在这里插入图片描述
我们声明一个object类型的y存储数据10,首先在栈开辟一个4个字节的空间(注意:引用类型都是首先在栈开辟四个自己的空间)在堆上面开辟一个int类型的字节存储值,并且返回一个地址,该地址210005存储的是10,object空间存储的就是210005的内容,所以访问object首先通过存储的地址找到210005再得到存储的数据10.

装箱操作

用我们上面两个int和object变量来进行说明装箱和拆箱

int x=10;
object y=x;

其中y=x的操作就是装箱操作。其过程首先开辟y的存储空间4个字节,在堆中开辟空间拷贝x存储空间中的内容,再对应的地址存储到y的存储空间中。

拆箱操作

object y=10;//这里不是装箱操作
int x=(int)y;

该操作是开辟x的存储空间,通过y存储的地址访问到数据,再拷贝地址存储的数据到x存储空间中。

总结

所以拆箱和装箱要进行地址的访问和拷贝,项目中的大量拆箱和装箱会大大的加大性能的损耗。所以我们在项目中要尽量避免装箱和拆箱的操作。

一个实用的避免方法—泛型

using System;

namespace 装箱拆箱
{
    class Program
    {
        static void Main(string[] args)
        {
            num("皮学渣");//这里的操作是首先声明一个string类型变量存储‘皮学渣‘ 信息,然后装箱成object类型再进行输出。
            num2("皮学渣");//这里才用泛型的操作,c#会自动识别类型,从而避免了装箱拆箱。所以我们可以使用泛型来进行避免
            Console.ReadKey();
        }

       static void num(object obj)
        {
            Console.WriteLine(obj);
        }

        static void num2<T>(T val )
        {
            Console.WriteLine(val);
        }
    }
}


请添加图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值