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

发布时间:2026/7/11 12:01:18

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/7/11 16:08:15

如何在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/7/9 15:03:04

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

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

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

2026/7/8 3:36:40

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…

解锁B站视频自由:用开源工具打造你的专属离线视频库

解锁B站视频自由:用开源工具打造你的专属离线视频库

2026/7/11 16:13:03

解锁B站视频自由:用开源工具打造你的专属离线视频库 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否曾经遇到过这样…

如何快速配置FreeCAD插件系统:5个高效技巧完整指南

如何快速配置FreeCAD插件系统:5个高效技巧完整指南

2026/7/11 16:13:03

如何快速配置FreeCAD插件系统:5个高效技巧完整指南 【免费下载链接】FreeCAD Official source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler. 项目地址: https://gitcode.com/GitHub_Trending/fr/freecad FreeCAD作为一款开…

Qwen2.5-1.5B-Instruct-ptpc-Quark-ts对话系统开发:构建智能客服的完整指南

Qwen2.5-1.5B-Instruct-ptpc-Quark-ts对话系统开发:构建智能客服的完整指南

2026/7/11 16:13:03

Qwen2.5-1.5B-Instruct-ptpc-Quark-ts对话系统开发:构建智能客服的完整指南 【免费下载链接】Qwen2.5-1.5B-Instruct-ptpc-Quark-ts 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Qwen2.5-1.5B-Instruct-ptpc-Quark-ts Qwen2.5-1.5B-Instruct-ptpc-Qua…

如何贡献Ising-Decoder-SurfaceCode-1-Fast:开发者入门手册

如何贡献Ising-Decoder-SurfaceCode-1-Fast:开发者入门手册

2026/7/11 16:13:03

如何贡献Ising-Decoder-SurfaceCode-1-Fast:开发者入门手册 【免费下载链接】Ising-Decoder-SurfaceCode-1-Fast 项目地址: https://ai.gitcode.com/hf_mirrors/nv-community/Ising-Decoder-SurfaceCode-1-Fast 想要为Ising-Decoder-SurfaceCode-1-Fast量子…

H5P交互式视频技术实现:从被动观看到主动学习的架构重构

H5P交互式视频技术实现:从被动观看到主动学习的架构重构

2026/7/11 16:13:03

H5P交互式视频技术实现:从被动观看到主动学习的架构重构 【免费下载链接】h5p-interactive-video 项目地址: https://gitcode.com/gh_mirrors/h5/h5p-interactive-video 传统视频内容面临的最大挑战是学习者参与度不足。我们如何将线性视频流转变为可交互的…

ZangoDB TypeScript支持:如何利用zangodb.d.ts提升开发体验

ZangoDB TypeScript支持:如何利用zangodb.d.ts提升开发体验

2026/7/11 16:03:03

ZangoDB TypeScript支持:如何利用zangodb.d.ts提升开发体验 【免费下载链接】zangodb MongoDB-like interface for HTML5 IndexedDB 项目地址: https://gitcode.com/gh_mirrors/za/zangodb ZangoDB是一个为HTML5 IndexedDB提供MongoDB式接口的JavaScript库&a…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/10 22:32:48

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/9 18:28:30

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/10 6:57:56

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制

2026/7/11 0:02:03

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 在数字隐私日益重要的今天,微信聊天记录作为个人数字资产的重要组成…

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符]

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符]

2026/7/11 0:02:03

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载…

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案

2026/7/11 0:02:03

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案 一、数据库备份最容易被忽略的问题,不是「有没有做备份」,而是「备份能不能恢复、恢复要多久、以及恢复后的数据对不对」 很多团队做数据库备份的方式是「写个 cron job&am…