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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:45:34