2026-06-09 / C# / .NET Core

C# 值类型、引用类型与对象语义

把 class、struct、object 放回类型语义里理解:什么时候表达值,什么时候表达对象身份。

C#.NET

C# 值类型、引用类型与对象语义

很多 C# 初学者会把 classstruct 简化成“一个在堆上,一个在栈上”。这个说法容易误导。真正重要的是:它们表达的语义不同。

值类型更像一个值:坐标、金额、范围、颜色。引用类型更像一个对象:订单、用户、连接、服务实例。

三个差异

  • 存储方式:值类型通常内联在宿主位置,引用类型变量保存对象引用。
  • 复制语义:值类型赋值更像复制值,引用类型赋值更像共享同一个对象。
  • 生命周期:引用类型对象通常由 GC 管理,值类型通常跟随宿主对象或栈帧。
csharp
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; }
}

选择建议

如果数据很小、不可变、没有独立身份,可以考虑值类型。如果对象有身份、状态变化、继承或共享语义,就应该使用引用类型。

这不是语法选择,而是建模选择。

C# 值类型、引用类型与对象语义 | Remi Resume