当前位置: 首页 > news >正文

C#从值类型、引用类型到装箱和拆箱

上一篇文章讲了C#的值类型和引用类型,这里再来看看值类型和引用类型最直接的使用场景:装箱和拆箱。

一、基本概念

装箱:值类型转化为引用类型的过程。从托管堆中为新生成的引用类型对象分配内存,再把值类型的实例字段拷贝到托管堆上新对象的内存中,然后返回对象的引用。

拆箱:引用类型转化为值类型的过程。获取指向对象中包含的值类型部分[数据字段]的指针,不会涉及字段拷贝。

利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来。

二、装箱/拆箱的内部操作

1、装箱

对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。按三步进行。

1)新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个SyncBlockIndex

2)将值类型的实例字段拷贝到新分配的内存中

3)返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用

 

2、拆箱

拆箱过程分两步进行:

1)检查对象实例,确保它是给定值类型的一个装箱值

2)将该值从实例复制到值类型变量中

通过上述的原理可以看出,装拆箱分配内存和拷贝数据会影响性能的操作,尽量避免装拆箱。 

三、装箱拆箱实例分析

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;
using System.Text;namespace ConsoleApplication1
{class Program{static void Main(string[] args){Dowork();}static void Dowork(){int i = 10;//将值类型的i装箱//需要注意的是:这里的装箱采用的是值的拷贝object obj = i;//检验是否装箱成功了if (obj is int){Console.WriteLine("数据已经装箱!");}//我们在这里更改i的值i = 33;Console.WriteLine("int i现在的值是:{0}", i);Console.WriteLine("int i装箱的值是:{0}", obj);//拆箱操作int j = (int)obj;Console.WriteLine("j的值为{0}", j.ToString());}}
}

小结:

从程序员的角度来看,装箱和拆箱是很方便的,我们不需要手动去复制和转移内存中的值类型和引用类型的数据。

但装箱和拆箱背后的栈/堆内存转移也带来了性能问题。所以,我们平时在编程时应当尽量避免发生装箱和拆箱操作。

http://www.lryc.cn/news/16221.html

相关文章:

  • Java中的逻辑运算符/移位运算符简单总结
  • 活动预告 | GAIDC 全球人工智能开发者先锋大会
  • 【Linux系统】认识操作系统和操作系统如何进行管理以及进程相关状态
  • 【0基础学爬虫】爬虫基础之HTTP协议的基本原理介绍
  • SpringBoot 整合定时任务
  • 我的零分周赛:CSDN周赛第30期,成绩“0”分,天然气定单、小艺读书、买苹果、圆桌
  • 二、Java虚拟机的基本结构
  • 华为OD机试 - 用户调度(Python) | 机试题+算法思路+考点+代码解析 【2023】
  • HashMap(JDK1.8)源码+底层数据结构分析
  • case的使用
  • Mac配置ITerm2
  • JUC并发编程(下)
  • API接口的基础知识
  • 基于Spring Boot的教务管理系统
  • 网页扫描图像并以pdf格式上传到服务器端
  • Airbyte入门
  • 研究人员在野外发现大量的信息窃取者 “Stealc “的样本
  • 数据结构——复杂度讲解(2)
  • 【LeetCode】任务调度器 [M](贪心)
  • Spring代理模式——静态代理和动态代理
  • Anaconda和PyCharm的一些安装问题和命令
  • sql优化建议
  • google hacker语句
  • Spring AOP
  • 【消费战略方法论】认识消费者的恒常原理(一):消费者稳态平衡原理
  • python居然能语音控制电脑壁纸切换,只需60行代码
  • 内存泄露定位手段(c语言hook malloc相关方式)
  • STM32 CAN波特率计算
  • C/C++ 中#define 的妙用,让代码更美一些
  • Linux文件系统操作与磁盘管理