在C#中,with 关键字主要用于记录类型 (record types),引入于 C# 9.0,用于创建基于现有对象的非破坏性(immutable)副本。
当使用 with 关键字时,可以创建一个新的对象,仅修改指定的属性值,而其他属性保持不变。
with 关键字的使用示例
1. 适用于 record 类型
record 类型是一种特殊的数据结构,默认是**不可变(immutable)**的,使用 with 关键字可以方便地创建对象的新实例。
解释:
person1是一个不可变的record实例。with关键字允许创建新的person2,仅更改Age属性,而不改变Name属性。record类型默认提供值相等性(value equality),因此person1和person2的比较将基于其字段值,而非引用。
2. 与 init 关键字配合使用
在 C# 9.0 及以上,init 访问器允许对象在初始化后保持不可变,with 可用于创建新的副本:
3. 适用于具名属性的 record
可以使用 with 对复杂的 record 对象进行修改:
限制与注意事项
-
仅适用于
record类型:with关键字不适用于普通的class或struct。- 若需类似功能,可手动实现拷贝构造函数。
-
不会修改原对象(不可变性):
with关键字创建的是副本,不会影响原始对象。
-
深度嵌套需要手动处理:
- 如果
record内部包含复杂对象,修改时需要分别使用with语法。
- 如果
C# 12 新增:匿名对象支持 with
在 C# 12 中,with 关键字可以用于匿名类型,提供类似功能:
浙公网安备 33010602011771号