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

推荐订阅源

P
Privacy & Cybersecurity Law Blog
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
B
Blog RSS Feed
罗磊的独立博客
V
V2EX
V
Visual Studio Blog
博客园 - 叶小钗
W
WeLiveSecurity
小众软件
小众软件
K
Kaspersky official blog
美团技术团队
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
Martin Fowler
Martin Fowler
Recorded Future
Recorded Future
Project Zero
Project Zero
Hugging Face - Blog
Hugging Face - Blog
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
Microsoft Azure Blog
Microsoft Azure Blog
V
Vulnerabilities – Threatpost
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
Help Net Security
Help Net Security
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Forbes - Security
Forbes - Security
M
MIT News - Artificial intelligence
H
Hacker News: Front Page
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
Spread Privacy
Spread Privacy
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Google Online Security Blog
Google Online Security Blog
PCI Perspectives
PCI Perspectives
The Last Watchdog
The Last Watchdog
AI
AI
N
News | PayPal Newsroom
D
DataBreaches.Net
Cloudbric
Cloudbric
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - z5337

【转】既然 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# 中一种轻量级、不可变、具有值语义的类型,特别适合用于数据模型和需要频繁比较值的场景。它通过自动生成的方法减少了样板代码,提高了开发效率。