C# 提示:使用 With 的记录类型
内容提要
C# 10引入了记录类型和'with'表达式,使得创建具有特定修改的不可变对象的副本更加容易。示例演示了创建具有更改价格的记录副本的过程。这个功能实用且强大。
延伸解读
不可变性与修改的平衡
记录类型默认设计为不可变,但实际开发中常需基于现有对象生成修改后的副本。with 表达式提供了一种简洁的语法,在不破坏原对象的前提下创建新实例。这既保留了不可变对象的线程安全和可预测性,又避免了手动构造新对象的繁琐,适合需要频繁派生新状态的场景。
语法细节与编译行为
示例中 `produto1 with { Preco = 3.49m }` 仅修改 Preco 属性,Nome 保持不变。编译器会生成一个复制方法,逐个复制所有字段,再应用指定的修改。注意 with 表达式只能用于记录类型,且修改的属性必须具有可访问的 set 或 init 访问器,否则编译会报错。
适用场景与注意事项
with 表达式特别适合领域模型、DTO 或配置对象,当需要基于已有实例调整少量属性时,代码更清晰。但需注意,如果记录包含引用类型属性,with 执行的是浅拷贝,修改引用类型内部状态可能影响原对象。此外,频繁创建副本可能带来性能开销,在热点路径中应谨慎使用。
Q&A
C# 10中的记录类型是什么?
记录类型是C# 10引入的一种简化创建不可变对象的方式。
'with'表达式在C#中有什么用?
'with'表达式用于在保持其他属性不变的情况下,修改对象的某些值。
如何使用'with'表达式创建记录副本?
可以通过'with'表达式创建记录副本,例如:var produto2 = produto1 with { Preco = 3.49m };
记录类型的主要优点是什么?
记录类型允许简单直接地创建不可变对象,便于管理和修改。
在项目中使用记录类型和'with'表达式有什么好处?
使用记录类型和'with'表达式可以高效地创建和管理对象副本,减少代码复杂性。
能否给出一个使用记录类型和'with'表达式的示例?
示例:创建一个产品记录并使用'with'表达式修改价格,保持其他属性不变。