C#中的Mutation是什么?求详细解析及示例说明
匿名类型的非破坏性突变详解
核心概念拆解
- Mutation(突变):在C#这个语境里,指的是修改对象的属性值。
- 非破坏性突变:不直接修改原对象(匿名类型本身是只读的,也没法直接改),而是创建一个新的匿名对象——复制原对象的所有属性值,只修改你指定的属性,原对象全程保持不变。
匿名类型的非破坏性突变示例
首先明确:匿名类型的属性默认是只读的,直接修改会报错,比如:
var person = new { Name = "Alice", Age = 30 }; person.Age = 31; // 编译错误:无法对只读属性赋值
这时候就用**with表达式**实现非破坏性突变,生成新对象:
// 原匿名对象 var person = new { Name = "Alice", Age = 30 }; // 非破坏性突变:创建新对象,仅修改Age,其余属性和原对象一致 var updatedPerson = person with { Age = 31 }; // 原对象未被修改 Console.WriteLine(person.Age); // 输出30 // 新对象是修改后的结果 Console.WriteLine(updatedPerson.Age); // 输出31
嵌套匿名类型的非破坏性突变示例:
var person = new { Name = "Bob", Address = new { City = "New York", ZipCode = "10001" } }; // 修改嵌套的ZipCode属性,其余属性保留原对象的值 var updatedPerson = person with { Address = person.Address with { ZipCode = "10002" } }; Console.WriteLine(person.Address.ZipCode); // 输出10001 Console.WriteLine(updatedPerson.Address.ZipCode); // 输出10002
为什么搜索结果多指向record类型?
因为record是C#专门为不可变数据设计的类型,with表达式是它的核心特性之一,官方文档和社区讨论里更多拿record举例。但从C# 9开始,匿名类型也支持with表达式做非破坏性突变,只是匿名类型无法复用类型,大多用在临时场景,所以相关讨论较少。
内容的提问来源于stack exchange,提问作者Cenko
相关产品推荐
相关产品推荐

