惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
WordPress大学
WordPress大学
博客园 - Franky
The Cloudflare Blog
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
小众软件
小众软件
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
B
Blog
Y
Y Combinator Blog
V
V2EX
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
博客园 - 司徒正美
IT之家
IT之家
G
Google Developers Blog
C
Check Point Blog
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - z5337

【转】禁用 Chrome 浏览器的自动更新 【转】Avalonia 12 最小信创项目模板 【转】Avalonia 周边介绍 【转】国产操作系统对 Avalonia 的支持情况 【转】国产操作系统优化篇 [openKylin] 入门知识点 【转】国产操作系统优化篇 [openKylin] 第一步 - Qt + VMware 【转】p2055dn 打印机配置 IP 地址 【转】Windows 锁屏后屏幕不熄灭排查 【转】既然 java 8 因为组件容易被攻击,.net core 也有大量第三方组件,是不是也容易出问题 【转】最小 web api 学习 【转】使用记事本区分图片格式 【转】蓝牙耳机的播放控制 【转】JoyToKey 键位映射 【转】[C#] 要从接口取时间,单个订单查询和批量查询,写一个接口还是两个接口合适? 【转】[C#] Web API 中的常见层次 【转】[C#] .net core 项目的目标框架设置 【转】[C#] 项目里的配置文件与选项对比 【转】[C#] GlobalUsing 的使用 【转】[.net core] 项目的 Windows 服务器部署 【转】《三字经》全文 【转】[IDEA] 调试时怎么判断使用哪个配置文件 【转】PO、DO、VO、BO、DTO、DAO、POJO 的区别 【转】[web]怎么移除网页最上层的水印 【转】[C#] 30+个.NET开发最佳实践 【转】[C#] WPF 保留选中的高亮色 【转】Windows Server 系统的桌面上显示 此电脑 图标 【转】[C#] 参数前加 in 的作用 【转】[C#] Enum 的 Flags 特性 【转】[C#] Tuples 元组介绍 【转】[C#] 预处理指令
【转】[C#] Record 的使用
z5337 · 2025-07-25 · via 博客园 - z5337

转自:https://doubao.com/chat

在 C# 9.0 及以后的版本中,record是一种特殊的引用类型,它提供了简洁的语法来创建不可变的数据模型。以下是关于 C# record的详细介绍:

record是一种引用类型,但在很多方面表现得像值类型:

  • 不可变性:默认情况下,record的属性是只读的(通过init访问器)。
  • 值语义:比较两个record实例时,比较的是它们的属性值,而非引用。
  • 不可变性:默认情况下,record的属性是只读的(通过init访问器)。
  • 值语义:比较两个record实例时,比较的是它们的属性值,而非引用。
  • 内置方法:自动生成ToString()Equals()GetHashCode()和解构方法。
  • 内置方法:自动生成ToString()Equals()GetHashCode()和解构方法。

使用参数列表声明属性:

public record Person(string FirstName, string LastName);

相当于隐式定义了:

public string FirstName { get; init; }
public string LastName { get; init; }
public record Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
};

record的属性默认是只读的,只能在初始化时设置值:

var person = new Person("John", "Doe");

初始化方式:

// 构造函数初始化
var person1 = new Person("Alice", "Smith");

record比较的是属性值,而非引用:

var p1 = new Person("John", "Doe");
var p2 = new Person("John", "Doe");

Console.WriteLine(p1 == p2);  
  • 继承:record可以继承自其他record,但不能继承自普通类。
  • 密封:使用sealed关键字防止被继承。
public record Employee(string FirstName, string LastName, int EmployeeId) 
    : Person(FirstName, LastName);  

创建一个新实例,复制原有属性并修改指定值:

var employee = new Employee("Alice", "Smith", 123);
var promotedEmployee = employee with { EmployeeId = 456 };

Console.WriteLine(employee.EmployeeId);  

自动支持解构操作:

var person = new Person("John", "Doe");
var (first, last) = person;  
特性recordclassstruct
类型 引用类型 引用类型 值类型
相等性 值语义 引用语义 值语义
默认不可变性 是(通过 init 访问器)
内置方法 自动生成 需手动实现 需手动实现
继承 可继承自其他 record 可继承自任何类 不可继承
  • 数据传输对象(DTO):简洁的语法适合定义轻量级数据模型。
  • 不可变对象:适合需要不可变性的场景(如多线程)。
  • 领域模型:值语义使其更适合表示领域中的实体。

record是 C# 中一种轻量级、不可变、具有值语义的类型,特别适合用于数据模型和需要频繁比较值的场景。它通过自动生成的方法减少了样板代码,提高了开发效率。