C#中record struct的用途是什么?为何要推出值类型record?
为什么要使用C#的record struct?
C# 9引入的record是一种基于值相等语义的引用类型,而C# 10新增的record struct则是把这套便捷特性搬到了值类型上。很多人会疑惑:既然record原本是引用类型,搞个值类型版本岂不是丢了引用类型的优势?其实不然,record struct的存在完全是为了适配特定场景的需求。
核心价值:给值类型补上record的便捷特性
record的核心优势从来不是"引用类型",而是自动实现值相等、ToString/Equals/HashCode方法、with表达式拷贝这些减少样板代码的特性。这些特性对于值类型同样刚需:
- 省去重复代码:普通
struct默认的相等是逐字段比较,但要自定义ToString、重写Equals/GetHashCode,或者实现类似不可变对象的拷贝逻辑,都要手动写大量代码。record struct会自动帮你生成这些,直接开箱即用。 - 性能适配小体量数据:如果你的数据类型是轻量的(比如坐标
Point、颜色Color、简单DTO),用引用类型会带来GC堆分配的额外开销,而值类型直接在栈上分配,性能更优。这时候想同时享受record的便捷,record struct就是最优解。 - 语义更清晰:用
record struct直接向其他开发者传递明确信息:这是一个值语义优先、不可变(如果是readonly版本)的纯数据载体,比普通struct的意图更明确。
举个实际例子
比如定义一个坐标类型,用readonly record struct:
public readonly record struct Point(int X, int Y);
你可以直接使用这些自动生成的特性:
var p1 = new Point(1, 2); // 使用with表达式快速拷贝并修改字段 var p2 = p1 with { X = 3 }; // 自动生成的ToString直接输出结构化内容 Console.WriteLine(p2); // 输出:Point { X = 3, Y = 2 } // 值相等语义直接生效 Console.WriteLine(p1.Equals(new Point(1,2))); // 输出:True
如果换成普通struct,你得自己实现Equals、GetHashCode、ToString,还要手动写拷贝逻辑,工作量大得多。
readonly record struct的额外优势
加上readonly修饰的record struct会强制不可变性,所有字段默认都是readonly,完美适合作为无状态的纯数据对象,避免意外修改导致的bug。
内容的提问来源于stack exchange,提问作者YungDeiza
相关产品推荐
相关产品推荐

