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 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能
相关推荐
包子BI大数据20 分钟前
3.openclaw小龙虾简单版安装教程程序大视界22 分钟前
【Python系列课程】Pandas(四):数据统计与排序——describe、sort_values、sample苏渡苇40 分钟前
Redis 持久化——RDB 快照 vs AOF 日志Cthy_hy1 小时前
Python算法竞赛:排列组合核心用法l1t1 小时前
DeepSeek总结的使用 PEG 实现运行时可扩展的 SQL 解析器这个DBA有点耶1 小时前
COUNT进阶(续):超大表去重计数的极致优化爱喝水的鱼丶1 小时前
SAP-ABAP:SAP 简单报表输出开发系列(共6篇) 第四篇:SAP 报表异常处理机制:数据校验与消息提示规范落地_1_71 小时前
SQL SERVER闪退问题解决C+-C资深大佬1 小时前
在PyCharm中创建虚拟环境的具体步骤是什么?ZengLiangYi1 小时前
sql.js WASM 深度解析