struct与record struct的差异及适用场景:求实际应用示例
Struct 与 Record Struct 应用场景对比
官方定义回顾
结构类型(或struct类型)是一种值类型,可封装数据及相关功能。
Record struct是一种封装数据的值类型。
对于struct,若两个对象类型相同且存储值相同,则二者相等。
对于record struct,若两个对象类型相同且存储值相同,则二者相等。
从定义上看两者确实高度相似,但实际开发中,它们的定位差异体现在是否需要自定义行为和是否追求代码简洁性上,以下是具体的应用场景示例:
一、优先使用传统 Struct 的场景
当你需要对类型行为做精细控制,或者类型除了存储数据外,还包含较多业务逻辑时,选择传统struct。
示例:带自定义逻辑的数值类型
public struct Temperature { private readonly double _celsius; public Temperature(double celsius) { _celsius = celsius; } // 自定义单位转换逻辑 public double Fahrenheit => _celsius * 9 / 5 + 32; public double Kelvin => _celsius + 273.15; // 手动实现浮点值的容错相等性判断 public override bool Equals(object obj) { return obj is Temperature temp && Math.Abs(temp._celsius - _celsius) < 0.001; } public override int GetHashCode() { return _celsius.GetHashCode(); } // 自定义格式化输出 public override string ToString() { return $"{_celsius:0.##}°C ({Fahrenheit:0.##}°F)"; } }
这个场景中,Temperature的核心是带业务逻辑的值封装,我们需要精确控制相等性(处理浮点值误差)、自定义转换规则和格式化输出,传统struct能让我们完全掌控这些细节。
二、优先使用 Record Struct 的场景
当你的类型核心是纯数据存储,不需要复杂自定义逻辑,希望快速获得开箱即用的便捷功能时,选择record struct。
场景1:简单数据传输对象(DTO)
// 编译器自动生成属性、Equals、GetHashCode、ToString、解构函数 public record struct UserInfo(int Id, string Username, string Email); // 使用示例 var user1 = new UserInfo(1, "Alice", "alice@example.com"); var user2 = new UserInfo(1, "Alice", "alice@example.com"); Console.WriteLine(user1.Equals(user2)); // 输出 True Console.WriteLine(user1); // 输出 UserInfo { Id = 1, Username = Alice, Email = alice@example.com } // 快速解构数据 var (id, name, email) = user1;
UserInfo仅用于传递用户数据,无额外业务逻辑,record struct自动帮我们实现了所有常用基础功能,避免编写重复的样板代码。
场景2:不可变数据快照
public record struct OrderSnapshot(int OrderId, DateTime CreateTime, decimal TotalAmount); // 使用示例 var orderSnap = new OrderSnapshot(1001, DateTime.Now, 299.9m); // 用 with 表达式快速创建修改后的副本(编译器自动生成) var updatedSnap = orderSnap with { TotalAmount = 349.9m };
record struct默认基于位置参数定义时是不可变的,且支持with表达式快速生成修改后的副本,非常适合记录数据的快照状态(比如订单历史状态、日志数据快照等)。
核心选择逻辑
- 传统struct:适合需要自定义行为、精细控制的值类型,比如带业务逻辑的数值、自定义集合元素等。
- Record struct:适合纯数据存储、不可变快照、DTO等场景,用最少的代码获得完整的基础功能。
内容的提问来源于stack exchange,提问作者AfshinZavvar
相关产品推荐
相关产品推荐

