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

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 语法的底层执行分为三步:

  1. 调用原对象的隐式复制构造函数,生成一个和原对象完全一致的拷贝
  2. 对 with 后大括号内指定的属性依次赋值
  3. 返回修改完成的新对象,整个过程不会修改原有对象

语言优势

  • 大幅简化代码:原来实现不可变修改需要手动新建对象,把原对象所有属性挨个赋值再修改目标属性,属性多的时候代码冗余还容易出错,用with只需要声明要修改的属性即可,其余逻辑由编译器自动处理
  • 降低错误概率:避免手动复制属性时漏写、错写属性的问题
  • 适配函数式编程习惯:不可变对象没有副作用,多线程场景下无需额外加锁,代码安全性和可读性更高
  • 填补匿名类型修改的空白:匿名类型无法手动声明类型做复制修改,with完美解决了这个需求

内容的提问来源于stack exchange,提问作者David Oganov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:24:04