record关键字定义不可变类型,简化数据模型创建;其默认值语义、非破坏性修改(with表达式)和自动实现Equals/GetHashCode提升代码安全与可维护性;适用于DTO、值对象、配置等场景,确保数据不可变,避免并发bug,增强线程安全性。

C#的
record
public record Product(int Id, string Name, decimal Price);
上面的代码就定义了一个不可变的
Product
record
init
with
// 创建一个Product实例
var p1 = new Product(1, "Laptop", 1200m);
// 尝试修改属性会报错,因为Name是init-only属性
// p1.Name = "Desktop"; // 编译错误:Init-only property or indexer 'Product.Name' can only be assigned in an object initializer, or on 'this' or 'base' in an instance constructor or an 'init' accessor.
// 使用with表达式进行非破坏性修改,创建一个新的record实例
var p2 = p1 with { Price = 1300m };
Console.WriteLine(p1); // Output: Product { Id = 1, Name = Laptop, Price = 1200 }
Console.WriteLine(p2); // Output: Product { Id = 1, Name = Laptop, Price = 1300 }
Console.WriteLine(ReferenceEquals(p1, p2)); // Output: False (它们是不同的对象)通过
with
record
在多线程和分布式系统日益普及的今天,可变状态是滋生bug的温床。我个人觉得,很多难以复现的并发问题,追根溯源都与某个共享的可变对象在不恰当的时机被修改有关。不可变类型从根本上消除了这种风险,因为它们一旦创建就不能被修改。这意味着你不需要担心一个对象在某个地方被意外更改,从而简化了并发编程,减少了锁的使用。
此外,不可变性极大地提升了代码的可预测性。当你在程序的任何地方传递一个不可变对象时,你都可以确信它的状态不会在不经意间发生变化。这使得调试变得容易得多,因为你不需要去追踪一个对象在不同方法调用中可能产生的各种副作用。在函数式编程范式中,不可变性更是基石,它鼓励我们编写无副作用的纯函数,让代码更易于理解、测试和维护。从长远来看,这种心智负担的减轻,远比多创建几个对象带来的微小性能开销更值得。
record
传统的C#类要实现不可变性,通常需要手动做很多工作。比如,你需要将所有属性设置为
get; init;
get; private set;
Equals
GetHashCode
record
init
record
Equals
GetHashCode
ToString
with
record
record
record
在领域驱动设计(DDD)中,它非常适合定义值对象,比如一个
Address
Money
DateRange
record
record
record
with
以上就是C#的record关键字如何定义不可变类型?有什么优势?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号