C#中的with运算符的作用、使用方法及优势是什么?
C#
with 关键字详解 核心作用
with 是C# 9.0版本引入的语法,核心作用是实现不可变对象的非破坏性修改:你不需要修改原有对象,只需要通过 with 语法生成一个原对象的拷贝,仅修改你指定的部分属性,其余属性完全和原对象保持一致。
你贴出的代码就是典型用法:基于已有 rectangle 对象生成新对象 newOne,仅修改 Width 属性为420,Height 等其余属性和原对象完全相同。
使用方法
支持的类型
- C# 9.0 及以上版本支持 record(记录) 类型
- C# 10.0 及以上版本扩展支持 struct(结构体) 和匿名类型
- 普通引用类型默认不支持
with语法,除非手动实现对应的复制构造函数
代码示例
record 类型使用示例
// 定义矩形record public record Rectangle(int Width, int Height); // 初始化原对象 var rectangle = new Rectangle(420, 69); // 仅修改Width属性生成新对象,Height保持原有的69 var newOne = rectangle with { Width = 420 }; // 同时修改多个属性 var anotherRectangle = rectangle with { Width = 100, Height = 200 };
结构体使用示例(C# 10+)
public struct Point { public int X { get; set; } public int Y { get; set; } } var p1 = new Point { X = 1, Y = 2 }; // 生成新点仅修改Y坐标,X保持为1 var p2 = p1 with { Y = 3 };
匿名类型使用示例
var person = new { Name = "张三", Age = 20 }; // 匿名类型也可以用with修改部分属性 var olderPerson = person with { Age = 21 };
执行逻辑
with 语法的底层执行分为三步:
- 调用原对象的隐式复制构造函数,生成一个和原对象完全一致的拷贝
- 对
with后大括号内指定的属性依次赋值 - 返回修改完成的新对象,整个过程不会修改原有对象
语言优势
- 大幅简化代码:原来实现不可变修改需要手动新建对象,把原对象所有属性挨个赋值再修改目标属性,属性多的时候代码冗余还容易出错,用
with只需要声明要修改的属性即可,其余逻辑由编译器自动处理 - 降低错误概率:避免手动复制属性时漏写、错写属性的问题
- 适配函数式编程习惯:不可变对象没有副作用,多线程场景下无需额外加锁,代码安全性和可读性更高
- 填补匿名类型修改的空白:匿名类型无法手动声明类型做复制修改,
with完美解决了这个需求
内容的提问来源于stack exchange,提问作者David Oganov
相关产品推荐
相关产品推荐

