C#

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 { } 赋值后共享

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

// 值类型
struct Point { public int X, Y; }   // 或直接用 int、double、bool、enum、DateTime 等

Point p1 = new Point { X = 10, Y = 20 };
Point p2 = p1;        // 完整拷贝
p2.X = 99;
Console.WriteLine(p1.X);  // 输出 10(不受影响)

// 引用类型
class Person { public string Name; }

Person per1 = new Person { Name = "张三" };
Person per2 = 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# 基础题基本无敌!

分类: C#
文章已创建 5041

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部