C# record:用 with 表达任务状态更新
定义任务 record,通过 with 生成已完成版本,理解值相等、原对象保留以及嵌套引用共享的限制。
本节目标
定义任务 record,通过 with 生成已完成版本,理解值相等、原对象保留以及嵌套引用共享的限制。
环境与运行方法
准备 .NET 8 SDK,创建目录后执行 dotnet new console --framework net8.0。用示例替换 Program.cs,执行 dotnet run。这里使用顶层语句,不要再套入另一份 Main。
核心思路
record 适合表达数据,with 在现有对象基础上复制并替换指定成员。这里用位置参数生成只初始化属性,让完成状态以新版本表达,便于比较前后变化。
完整示例
var original = new TaskItem("review", 30, false);
var updated = original with { Done = true };
Console.WriteLine("original=" + original.Done);
Console.WriteLine("updated=" + updated.Done);
Console.WriteLine("same=" + (original == updated));
record TaskItem(string Title, int Minutes, bool Done);预期输出
original=False
updated=True
same=False逐步理解
original 保持未完成,updated 是完成版本。record 默认按成员值比较,因此 Done 不同导致相等比较为 False,而不只是比较是否同一个引用。
with 是浅复制。如果成员是 List,两个 record 仍可能引用同一列表。不要因为外层使用 record 就断言整个对象图不可变。任务版本也不应未经区分地同时参加当前状态统计,否则容易重复计数。
常见问题与边界
- record 的值相等不等于数据库主键相同。
- with 不会自动递归复制内部对象。
- 输入约束如标题非空仍需主动验证。
动手练习
再创建一个成员都与 original 相同的 TaskItem,比较 ==。
参考答案
值比较应为 True,即使是另一个对象。若系统只按 ID 判断同一任务,应另外设计身份与版本关系,不能直接套用默认值相等。
文章回复
0 条公开回复