You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Automapper做DTO自动映射:用record替代class有何优势?

用record替代class作为DTO/ViewModel的益处(针对你的场景)

即使你无法使用record的主构造函数形式,将上述的class替换为record依然能带来不少实际益处,具体如下:

  • 自动值相等性,无需手动重写Equals/GetHashCode
    对于DTO这类数据载体,我们通常需要比较的是「数据内容是否一致」,而非「是否为同一个对象实例」。record默认会基于所有属性的值实现相等性判断,而class默认是引用相等。比如你要判断两个DownloadCenterFileElementViewModel是否代表同一个文件,record会自动对比FileID、FileNameFriendly等所有属性的值,不用你手动编写Equals和GetHashCode的重写代码,减少重复工作。

  • 支持with表达式,便捷创建不可变副本
    你的类属性都是init修饰的(不可变),如果需要基于现有实例修改部分属性生成新实例,record的with表达式可以直接实现:

    var updatedViewModel = existingViewModel with { DateLastUpdated = DateTime.UtcNow };
    

    而class要实现这个逻辑,要么手动编写复制构造函数,要么借助AutoMapper,with表达式更直观简洁,符合不可变数据的使用习惯。

  • 更清晰的语义传达
    record的设计初衷就是作为不可变数据载体,用它定义DTO和ViewModel,能直接向其他开发者传递明确的代码意图:这些类仅用于跨层传递数据,不包含业务逻辑,且实例创建后状态不可修改。而class的语义更宽泛,容易被误解为包含状态和行为的业务对象。

  • 调试更友好,自动生成ToString
    record会自动生成包含所有属性名称和值的ToString方法输出,比如打印DownloadCenterFileElementViewModel实例时,会直接看到FileID、FileNameFriendly等所有属性的具体值,不用你手动重写ToString来方便调试。

  • AutoMapper完全兼容
    你当前使用的AutoMapper映射逻辑不需要任何修改,AutoMapper可以正常处理record的init属性,和class的init属性映射行为完全一致,不会有兼容性问题。

内容的提问来源于stack exchange,提问作者Oleg Sh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:11:24