C#基于数据类型解读装箱拆箱

C#基于数据类型解读装箱拆箱

了解C#的装箱和拆箱的原理,首先要了解数据类型的存储。在C#中有两种基本类型,分别是值类型和引用类型。如图所示:

在这里插入图片描述

值类型与引用类型的区别:
1、在内存上的存储地方不同。值类型存储在栈中,引用类型存储在堆中。
2、变量传递的方式不一样。值类型传递的是值,而引用类型传递变量的储存地址(除string类型外)。
  1. 值类型
    值类型包括基本数据类型(整数类型、浮点类型、decimal类型、bool类型、字符类型)、结构和枚举。当定义一个值类型的变量时,系统会分配一块大小相适应的存储区域给这个变量,随后对这个变量的读或写操作就直接在这块内存区域进行。

    定义两个值类型变量进行分析:
    在这里插入图片描述
    变量num1和变量num2修改前堆栈的情况:
    在这里插入图片描述
    变量num1和变量num2修改后堆栈的情况:
    在这里插入图片描述

    值类型变量的特点
    ①值类型变量都存储在栈中。
    ②复制值类型变量时,复制的是变量的值,而不是变量地址。
    ③每个值类型变量都有自己的数据副本,因此对一个值类型变量的操作不会影响到其他变量。

  2. 引用类型
    在C#中所有的类都是引用类型,主要包括类、委托、数组和接口。一个引用类型的变量不存储它们所代表的实际数据,而是存储实际数据的引用。引用类型分两步创建,首先在栈上创建一个引用变量,然后在堆上创建对象本身(写入数据),再把堆上内存的首地址赋值给引用变量但对于引用类型的数据的修改,string类型有自己的特殊性。这里先分析string类型的存储,再分析一般的引用类型存储。

    定义两个string类型变量进行分析:
    在这里插入图片描述
    变量str1和变量str2修改前堆栈的情况:
    在这里插入图片描述
    变量str1第一次修改后堆栈的情况:
    在这里插入图片描述
    变量str1第二次修改后堆栈的情况:
    在这里插入图片描述

    string类型很特殊,拥有自己的另一套机制。当重新赋值时,系统直接再堆上开辟内存空间,然后将实际数据的引用修改为堆上开辟的地址。因此,当修改了一个变量堆上数据的时候,会重新在堆上分配空间并写入数据,是不会对另一个变量的数据产生影响的。但是,对于其他引用类型来说,修改了其中一个变量在堆上的数据,就等于修改了所有引用这个堆地址的数据。除了string类型以外,其他的引用类型采用的是对堆上数据进行修改,而不是另外开辟内存空间。下面介绍常规的引用类型的存储机制。

    定义两个数组类型变量进行分析:
    在这里插入图片描述
    变量arr1修改前堆栈的情况:
    在这里插入图片描述
    变量arr1修改后堆栈的情况:
    在这里插入图片描述

  3. 装箱

    装箱在值类型向引用类型转换时发生。执行装箱操作时不可避免地要在堆上申请内存空间,并将栈上的值类型数据复制到申请的堆内存空间上,这肯定是要消耗内存和CPU资源的。

    声明引用类型Object变量和值类型int变量进行分析:

    在这里插入图片描述
    装箱过程:
    ①在堆上开辟一个空间
    ②将值类型数据存储到堆中的空间
    ③返回分配的地址

    在这里插入图片描述

  4. 拆箱

    拆箱在引用类型向值类型转换时发生。拆箱操作的执行过程和装箱操作过程正好相反,是将存储在堆上的引用类型值转换为值类型并赋值给值类型变量。

    声明引用类型Object变量和值类型int变量进行分析:

    在这里插入图片描述
    拆箱过程:
    ①检查实例,确保类型与值类型变量一致
    ②将数据从实例复制到值类型变量中

    在这里插入图片描述

最后两点总结:
1、装箱和拆箱大大降低了运行速度,在代码中应尽量避免。
2、装箱和拆箱要看两个类型的继承关系。根据里根转换得出,两个类要存在继承关系才能发生转换。

因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值