C# 值类型与引用类型 详解

发布时间:2026/8/27 3:27:57

C# 值类型与引用类型 详解
C# 值类型与引用类型 完整详解一、核心本质区别内存存储1. 内存分配位置值类型Value Type变量数据直接存储在栈(Stack)上变量本身就是数据。引用类型Reference Type实际数据存放在堆(Heap)栈上只存一个内存地址引用通过地址指向堆中的对象。2. 赋值行为差异值类型赋值完整拷贝副本赋值时把全部数据复制一份两个变量完全独立修改其中一个不会影响另一个。引用类型赋值拷贝地址浅拷贝只复制堆地址两个变量指向同一个堆对象任意一个修改对象内容两边同时变化。3. 生命周期与回收值类型栈自动回收超出作用域立刻销毁无GC开销。引用类型靠CLR垃圾回收器(GC)管理堆内存无任何引用指向对象后才会被GC回收。4. 默认值值类型必有默认值不能为null可空值类型除外引用类型默认值是null代表栈上没有指向任何堆对象二、值类型完整分类所有值类型隐式继承System.ValueType而ValueType本身又继承object。1. 简单内置值类型分类类型说明整数sbyte、byte、short、ushort、int、uint、long、ulong固定长度数字浮点float、double小数高精度小数decimal财务计算专用布尔booltrue/false字符char单个Unicode字符2. 枚举enum底层基于整型属于值类型enumColor{Red,Green}// 值类型Colorc1Color.Red;Colorc2c1;// 拷贝独立副本c1Color.Green;// c2不受影响3. 结构体struct自定义值类型可包含字段、方法、属性、构造函数structPoint// 值类型{publicintX;publicintY;}Pointp1newPoint{X1,Y2};Pointp2p1;// 完整复制X、Yp1.X100;// p2.X 仍然是 1互不干扰注意C# 10 支持无参构造函数结构体默认无参构造永远存在自动赋0/默认值。4. 可空值类型NullableT/T?普通值类型不能为null包装后允许空int?numnull;// Nullableintif(num.HasValue){}值类型内存图解inta10;intba;a20;栈内存栈a 10 → 修改后20 栈b 10 独立副本不受影响三、引用类型完整分类所有引用类型直接/间接继承System.Object数据存堆栈存引用地址。1. 类class最常用自定义引用类型实例分配在堆classPerson// 引用类型{publicstringName;}Personp1newPerson{Name张三};Personp2p1;// 仅复制堆地址指向同一个对象p1.Name李四;Console.WriteLine(p2.Name);// 输出李四同步修改内存图解栈p1 → 0x001堆地址 栈p2 → 0x001 堆0x001{ Name张三 } → 修改为李四2. 字符串string特殊引用类型不可变immutable属于class存在堆一旦创建无法修改拼接/替换会生成全新字符串字符串池优化相同字面量复用地堆内存。strings1abc;strings2s1;s1xyz;// 新建堆对象s2仍指向abc3. 数组Array不管元素是值类型还是引用类型数组本身永远是引用类型int[]arr1newint[2]{1,2};int[]arr2arr1;arr1[0]99;Console.WriteLine(arr2[0]);// 99共享数组4. 接口interface本身不能实例化但接口变量是引用类型存储实现类对象的地址。5. 委托delegate、事件event本质封装方法指针属于引用类型。6. 动态类型dynamic底层基于object引用类型。四、装箱与拆箱值类型 ↔ object1. 装箱(Boxing)值类型 → 引用类型把栈上的值类型数据复制到堆中包装为object生成引用intnum10;// 栈objectobjnum;// 装箱堆创建object副本obj存堆地址开销分配堆内存、拷贝数据频繁装箱影响性能。2. 拆箱(Unboxing)object → 值类型从堆的object中取出原始值类型数据复制回栈必须强制转换intnum2(int)obj;// 拆箱错误示范类型不匹配会抛InvalidCastException。避免装箱优化使用泛型ListT而非ArrayList泛型容器不会装箱拆箱。五、关键易混淆知识点1. struct vs class 核心选用场景用 struct值类型满足全部小型数据通常实例大小16字节数据轻量很少做赋值拷贝无需继承、多态语义是单一数据点坐标、颜色、尺寸用 class引用类型满足任意数据量大需要频繁传递、共享对象需要继承、多态、接口多实现语义是业务实体用户、订单、商品2. ref / out / in 参数改变值类型传递逻辑默认值类型传参是值拷贝加ref后传递栈变量地址方法内修改会影响外部变量staticvoidModify(refintx){x999;}inta10;Modify(refa);// a 9993. 只读结构体readonly struct结构体所有字段只读拷贝时编译器可做优化减少复制开销。4. 字符串特殊的相等判断string重载比较字符内容object.ReferenceEquals(s1,s2)比较是否指向同一个堆地址判断字符串池复用5. 空值区别值类型int不能nullint?才允许null引用类型string默认null代表无堆对象六、对比总结表对比维度值类型(Value Type)引用类型(Reference Type)存储位置栈Stack数据堆Heap栈存地址赋值逻辑完整复制数据副本仅复制内存地址共享对象默认值数字0、false、\0不可nullnull无堆对象内存回收栈自动释放无GCGC标记清除回收堆内存继承根System.ValueType → object直接继承object代表类型struct、enum、int/bool/char等class、string、数组、委托、接口修改传递副本互不干扰一处修改全部同步装箱拆箱支持有性能损耗无需装箱七、完整演示代码usingSystem;// 值类型结构体structPoint{publicintX;publicintY;}// 引用类型类classStudent{publicstringName;}classProgram{staticvoidMain(){// 值类型演示 Pointp1newPoint{X10,Y20};Pointp2p1;p1.X999;Console.WriteLine($值类型 p2.X {p2.X});// 10不受影响// 引用类型演示 Students1newStudent{Name小明};Students2s1;s1.Name小红;Console.WriteLine($引用类型 s2.Name {s2.Name});// 小红同步变化// 装箱拆箱 intnum100;objectboxObjnum;// 装箱intunboxNum(int)boxObj;// 拆箱Console.WriteLine($拆箱结果{unboxNum});}}输出值类型 p2.X 10 引用类型 s2.Name 小红 拆箱结果100八、常见踩坑点结构体作为List元素修改无效ListPoint取出的是结构体副本直接修改属性不会改变集合内数据要用索引重新赋值。频繁new class产生大量GC高频循环内创建类实例会造成堆碎片可改用结构体或对象池优化。字符串拼接性能差string不可变大量拼接用StringBuilder。拆箱强制转换类型错误抛异常装箱是什么类型拆箱必须对应类型不能隐式转换。数组永远是引用类型哪怕数组元素是int值类型数组本身传递依然共享。

相关新闻

如何在Blender中实现完美3D打印工作流:3MF格式完整指南

如何在Blender中实现完美3D打印工作流:3MF格式完整指南

2026/8/27 0:34:41

如何在Blender中实现完美3D打印工作流:3MF格式完整指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat Blender3mfFormat插件是连接Blender创意设计与3D打印制…

【HarmonyOS 7开发者前瞻】03 HarmonyOS 7 API 26 新 API 找不到,先用 5 层状态判断能力可用性

【HarmonyOS 7开发者前瞻】03 HarmonyOS 7 API 26 新 API 找不到,先用 5 层状态判断能力可用性

2026/8/27 2:30:33

前言 拿到 HarmonyOS 7 API 26 Beta 之后,最容易遇到的一类问题,就是发布会或者新能力页面已经出现某个能力,但在本地 SDK、API Reference 或项目代码里暂时找不到对应入口。 这个情况很常见,也很容易让人误判。 你可能会遇到几种…

GearOS:openEuler社区的工业控制实时操作系统完全指南

GearOS:openEuler社区的工业控制实时操作系统完全指南

2026/8/25 16:56:22

GearOS:openEuler社区的工业控制实时操作系统完全指南 【免费下载链接】GearOS GearOS is a real-time enhanced operating system for the industrial control field incubated by the openEuler open-source community Industrial-Control SIG. 项目地址: https…

粒子群优化算法(PSO)原理详解与Python实战:从参数调优到非线性方程求解

粒子群优化算法(PSO)原理详解与Python实战:从参数调优到非线性方程求解

2026/8/27 3:27:21

1. 从“鸟群觅食”到工程优化:粒子群算法的直觉理解如果你在工程优化、参数调优或者寻找复杂函数最优解的路上碰过壁,那你大概率听说过“粒子群优化算法”这个名字。我第一次接触它,是在为一个工业控制系统寻找最优PID参数的时候。面对一个多…

WorkBuddy实战:用Skill与自定义指令构建自动更新项目看板

WorkBuddy实战:用Skill与自定义指令构建自动更新项目看板

2026/8/27 3:27:21

开头我先说一个关键判断:WorkBuddy 这类工具,真正值得花时间的不是“会安装”,而是“把一条重复的日常工作流变成自动执行的任务”。项目看板正好是最典型的落地场景。你不需要手动整理任务状态,不需要反复复制粘贴进度&#xff0…

2.6万预算AMD X3D+RTX 5080游戏设计主机装机指南

2.6万预算AMD X3D+RTX 5080游戏设计主机装机指南

2026/8/27 3:27:21

一台预算 2.6 万元、既要打游戏又要兼顾设计工作的主机,最难的不是把钱花完,而是把钱花在真正影响体验的部件上。标题里的 AMD 9850X3D 和 华硕 5080 设计师显卡,组合起来正好代表两个方向:AMD X3D 系列对游戏场景的缓存优化明显&…

工业表面缺陷检测:PyTorch实战U-Net与SqueezeNet协同部署

工业表面缺陷检测:PyTorch实战U-Net与SqueezeNet协同部署

2026/8/27 3:27:21

1. 这不是“刷题”,而是一次工业级缺陷检测的实战推演表面缺陷检测——这个词在2023年第十二届“认证杯”B题里,绝不是教科书上模糊的示意图或合成数据集里的几个圆圈划痕。它背后是冷轧钢板产线实时图像中0.1mm级的微裂纹、手机玻璃盖板边缘肉眼难辨的应…

单细胞轨迹推断:加速度匹配如何破解方向性难题

单细胞轨迹推断:加速度匹配如何破解方向性难题

2026/8/27 3:27:21

做单细胞数据分析的人,大概率遇到过这种情况:手里的表达矩阵看起来结构清晰,聚类也分得开,但一到轨迹推断,结果就开始失控。同一份数据,用一种方法画出来是从 A 到 B,换一种方法就变成从 B 到 A…

多智能体强化学习Simulink建模实战:从环境搭建到部署

多智能体强化学习Simulink建模实战:从环境搭建到部署

2026/8/27 3:17:20

简介:强化学习是智能体通过与环境交互学习最优策略的范式,当任务涉及多个决策实体协同或对抗时,便演进为多智能体强化学习(MARL)。其核心挑战在于环境非平稳性,常用CTDE框架在训练时利用全局信息、执行时仅…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…