当前位置: 首页 > news >正文

C#怎么使用with表达式 C#record类型中with表达式怎么用如何创建对象的修改副本【语法】

with表达式仅支持record类型(含record class/struct),不支持普通class或struct;其为浅拷贝,不递归复制引用对象;init setter中调用with易致无限递归,需避免。with 表达式只能用于 record 类型不是所有类都能用 with,只有 record(包括 record class 和 record struct)才支持。普通 class 或 struct 写 obj with { Prop = value } 会直接编译报错:CS8852: Init-only property or indexer 'X' can only be assigned in an object initializer, or on 'this' in an instance constructor。常见错误是把老代码里的类改成 record 时漏掉 record 关键字,或者误以为继承自 record 的子类自动获得 with 能力——其实不行,子类也得显式声明为 record。record 是语法糖,底层靠生成 Clone() + init 属性 + 编译器合成的 With 方法实现如果类型里有非 init 的可变属性(比如只有 set 没有 init),with 表达式不会修改它,也不会报错,容易误以为改成功了record struct 同样支持 with,但要注意值类型的语义:每次 with 都是新副本,原变量不变with 会深拷贝还是浅拷贝?with 表达式只做浅拷贝 —— 它复制字段值,不递归复制引用对象。如果 record 里有个 List<string> 字段,with 出来的新实例和原实例共享同一个 List 对象。这在多线程或后续修改集合时容易出问题。比如:var r1 = new Person("Alice", new List<string> { "A" });var r2 = r1 with { Name = "Bob" };r2.Hobbies.Add("B"); // r1.Hobbies 也会变成 ["A", "B"]想真正“不可变”,嵌套的引用类型字段本身也得是 record 或不可变类型(如 IReadOnlyList<T>、ImmutableArray<T>)没有银弹:如果必须深拷贝,得自己写逻辑,with 不负责、也不支持指定深度with 对 null 字段照常赋值,不会跳过或报空引用异常with 表达式中访问 this 成员要小心循环引用在 with 初始化器里,不能直接用 this.Xxx 引用当前实例成员,因为此时 this 尚未完成构造。但更隐蔽的问题是:如果你在 record 的 init 属性 setter 里又调用了 with,可能触发无限递归。典型场景是带验证逻辑的 init setter: 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能

http://www.jsqmd.com/news/656991/

相关文章:

  • 苍穹外卖day2
  • 奇偶判断:从取余到位运算的优雅解法
  • Excel公式格式化终极指南:如何让复杂公式一目了然
  • 开发者实战:2026年主流Claw工具技术对比与配置指南
  • Zotero文献格式化插件:3步打造规范学术文献库的终极指南
  • Claude Code 桌面版上线翻车:bug 多、结构失控,‘100% AI 编写’质量堪忧!
  • 生产刮刮卡定制制造商推荐
  • 从大模型到自主决策:AI Agent的核心进化路径
  • Boss-Key:你的Windows桌面隐身大师,一键隐藏所有敏感窗口
  • PHP线上死锁的庖丁解牛
  • 从零到一:用MK60单片机+鹰眼摄像头,手把手教你搭建一个能画方块的板球控制系统
  • Cursor Free VIP:解锁AI编程助手完整功能的终极方案
  • WinUtil:Windows系统优化与软件安装的终极解决方案
  • 移动端点 链接bing
  • 告别手动配置:用STM32CubeMX快速搞定STM32F407的DP83848以太网与LWIP初始化(附常见Ping不通问题排查)
  • 3步终极解锁VMware macOS虚拟机:开源工具Unlocker完整指南
  • A股沪指站稳4000点五连阳:银行股接棒主线,价值切换下的投资逻辑梳理
  • The 4th Universal Cup. Stage 13: Grand Prix of Ōokayama(无 DEL)
  • 树图管理化技术中的树图计划树图实施树图验证
  • GFS读写过程
  • 完全指南:高效使用开源工具突破Cursor AI Pro限制
  • 如何用LangChain开发一个Agent,20分钟搞定!
  • SAP接口集成-PO/PI-SLD配置实战:从系统格局到集成目录
  • 2026LINE养号:新号总被封?LINE账号养号与防封完整指南
  • 新年快乐 wp
  • Beyond Compare 5 密钥生成器:从技术原理到企业级部署指南
  • reverse2 wp
  • Element UI中国省市区级联数据:终极完整指南与实战教程
  • 独立站SEO流量增长:提高Google排名的优化方法
  • Eigen 3.4.90 矩阵操作实战 | C++高效线性代数指南(一)