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

C# 中值类型和引用类型的主要区别是什么

C# 中值类型(Value Type)和引用类型(Reference Type)的主要区别(基于 .NET 官方文档 CTS 规则,2025 年最新无核心变化):

这是 C#/.NET 类型系统的核心基础,几乎所有面试(阿里、腾讯、字节、微软)必问。理解它能避免大量性能 bug 和诡异行为。

1.最核心区别:存储方式 + 赋值语义(面试官最爱听这个)

维度值类型 (Value Type)引用类型 (Reference Type)
变量存储内容直接存储数据本身(值)存储对象的引用(地址/指针)
赋值行为拷贝一份完整数据
两个变量完全独立,修改一个不影响另一个
拷贝引用(地址)
两个变量指向同一个对象,修改一个会影响另一个
内存分配内联分配:栈(局部变量)或嵌入在对象中(字段)
小而快,无 GC
托管堆(Managed Heap)上分配
大而慢,由垃圾回收器(GC)管理
示例int a = 5; int b = a; b = 10;→ a 仍为 5string s1 = "hello"; string s2 = s1; s2 = "world";→ s1 仍为 “hello”(string 特殊但仍是引用)
class Person { } 赋值后共享

经典代码演示(建议面试时手写):

// 值类型structPoint{publicintX,Y;}// 或直接用 int、double、bool、enum、DateTime 等Pointp1=newPoint{X=10,Y=20};Pointp2=p1;// 完整拷贝p2.X=99;Console.WriteLine(p1.X);// 输出 10(不受影响)// 引用类型classPerson{publicstringName;}Personper1=newPerson{Name="张三"};Personper2=per1;// 只拷贝引用per2.Name="李四";Console.WriteLine(per1.Name);// 输出 李四(被影响了!)

2.其他重要区别(体现深度)

  • 继承与派生

    • 值类型:密封的,不能被继承(不能写struct MyInt : int)。只能继承自System.ValueType(最终都继承System.Object)。
    • 引用类型:支持完整继承、多态、虚方法重写(classrecord class可继承)。
  • null 支持

    • 值类型:默认不能为 null(C# 8+ 可空值类型int?除外)。
    • 引用类型:默认可为 null。
  • 相等性比较

    • 值类型:值相等(内容相同就相等)。
    • 引用类型:默认引用相等ReferenceEquals)。record类型编译器自动生成值相等。
  • 性能与 GC

    • 值类型:分配快、无 GC 压力、适合高性能场景(游戏、数值计算)。
    • 引用类型:有 GC 开销,但 CLR 已高度优化。大对象(>85KB)进大对象堆(LOH)。
  • 装箱(Boxing)与拆箱

    • 值类型转为object或接口时会装箱(拷贝到堆上,产生 GC 压力)。
    • 这是值类型最大的性能坑,面试常问。

3.C# 中具体哪些是值类型 / 引用类型?

值类型(struct / record struct):

  • 所有内置数值类型:intlongfloatdoubledecimalbyte
  • boolcharDateTimeTimeSpanGuid
  • 自定义structenum
  • record struct(C# 10+)

引用类型(class / record class):

  • classrecordrecord class
  • string(虽然行为像值类型,但本质是引用)
  • 数组(int[]也是引用,即使元素是值类型)
  • objectdelegate、接口、dynamic

4.一句话总结(面试开场 15 秒版)

“值类型变量直接包含数据,赋值时拷贝值,栈/内联分配,不可继承;引用类型变量保存引用,赋值时拷贝地址,堆分配,可继承、可 null、共享实例。根本区别来自 .NET 通用类型系统(CTS)的设计,导致赋值语义、内存管理和性能完全不同。”

掌握这个,99%的相关追问(如“为什么 struct 比 class 快?”“string 为什么特殊?”“record struct 有什么用?”)都能轻松回答。

需要我补充:

  • 手撕装箱/拆箱代码 + IL 分析
  • struct vs class 性能对比基准测试
  • C# 10+ record struct 的新特性
  • 面试高频追问 10 题

随时说~ 这知识点背熟后,C# 基础题基本无敌!

http://www.jsqmd.com/news/465776/

相关文章:

  • oracle 26ai 创建的默认表空间竟然是big - a
  • FOC滑膜观测器(SMO+PLL)Matlab 2021b模型实现:零速闭环启动与硬件开环启动...
  • 网站生成页面空白/中断排查|已解决
  • 线程、进程、协程的区别是什么?
  • MySQL面试必问:存储用户密码,char还是varchar?答案出乎意料!
  • 腾讯面试必杀题:JDK 7 和 8 的 ConcurrentHashMap 对比,回答好这一题直接定级P6
  • 基于AI驱动 传声港成为国内主流软文营销平台标杆 - 博客湾
  • 网站访问数不统计问题解决|已解决
  • MySQL同步ES的5种方案!
  • 计算机毕业设计java基于Web的Office在线评阅系统PowerPoint子系统服务器端阅卷程序的设计与实现 基于B/S架构的Office作品在线评阅平台面向教学场景的PPT作业智能评阅系统设计
  • Passware Kit 2026 v1 新版本功能亮点
  • Docker从零开始安装配置全攻略
  • 长沙网络推广公司排名实评:全链路落地,适配多行业需求 - 亿仁imc
  • Linux发行版选型全攻略,务必选择适合你的版本(收藏!)
  • 计算机毕业设计java基于Web的毕业设计选题系统 基于B/S架构的毕业设计课题双向选择系统 面向高校的毕业设计在线选题与过程管理平台
  • Double vowels in English
  • 超微量分光光度计品牌推荐|2026 靠谱选购指南 - 品牌推荐大师
  • 基于java+springboot的家教预约网站、家教信息管理系统源码+运行步骤+计算机技术
  • 网站出现 500 错误,最简单快速解决方法
  • 网站导致打不开怎么改,权限修改后仍打不开(SELinux/AppArmor干扰)
  • 2026年车床刀塔选购建议:从性能、售后到性价比全面对比 - 品牌推荐大师
  • 网站出现 500 错误,大概率是服务器自身问题(如服务器过载、程序报错、数据库异常)
  • 长沙网络推广公司排名实评:聚焦性价比,严控推广成本 - 亿仁imc
  • 网站文件权限错误,导致打不开怎么办?
  • 水位标尺测量水位读数水位监测检测数据集VOC+YOLO格式493张60类别
  • 2026 新闻发布平台推荐 传声港实现高效权威品牌传播 - 博客湾
  • AI 数学的秘密花园:19.语义压缩(知识JPEG,不是死记,是聪明压缩)
  • CNSH中文编辑器·完整纠错规则库 v2.0
  • 长沙GEO优化公司实测评测:聚焦本地服务适配与技术落地 - 亿仁imc
  • 2026水处理药剂优质服务商 聚丙烯酰胺、聚合氯化铝五家商家值得关注 - 深度智识库