2026-06-09 / C# / .NET Core
C# 值类型、引用类型与对象语义
把 class、struct、object 放回类型语义里理解:什么时候表达值,什么时候表达对象身份。
C#.NET
C# 值类型、引用类型与对象语义
很多 C# 初学者会把 class 和 struct 简化成“一个在堆上,一个在栈上”。这个说法容易误导。真正重要的是:它们表达的语义不同。
值类型更像一个值:坐标、金额、范围、颜色。引用类型更像一个对象:订单、用户、连接、服务实例。
三个差异
- 存储方式:值类型通常内联在宿主位置,引用类型变量保存对象引用。
- 复制语义:值类型赋值更像复制值,引用类型赋值更像共享同一个对象。
- 生命周期:引用类型对象通常由 GC 管理,值类型通常跟随宿主对象或栈帧。
public readonly struct Money
{
public decimal Amount { get; }
public string Currency { get; }
}
public sealed class Order
{
public Guid Id { get; } = Guid.NewGuid();
public Money Total { get; init; }
}
选择建议
如果数据很小、不可变、没有独立身份,可以考虑值类型。如果对象有身份、状态变化、继承或共享语义,就应该使用引用类型。
这不是语法选择,而是建模选择。