当前位置: 首页 > news >正文

c# Record关键字

在 C# 9.0 中引入了 record 关键字,用于定义记录类型(Record Types)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相等性比较、生成属性和方法等功能,使得编写数据类更加简洁和高效。

基本概念

  • 不可变性:记录类型默认是不可变的,这意味着它们的属性是只读的,不能被修改。
  • 相等性:记录类型根据其值进行相等比较,而不是引用比较。
  • 自动化成员:记录类型可以自动生成构造函数、属性、ToStringEqualsGetHashCode 方法。

声明记录类型

记录类型的声明非常简洁,基本语法如下:

public record Person(string FirstName, string LastName, int Age);

这会生成一个包含 FirstNameLastNameAge 属性的记录类型,并自动提供构造函数、ToStringEqualsGetHashCode 方法。

不可变性和可变性

  • 不可变记录:默认情况下,记录类型是不可变的,属性是只读的。例如:
public record Person(string FirstName, string LastName, int Age);
  • 可变记录:可以通过在记录类型后添加 with 关键字来创建可变记录,允许修改属性。例如:
public record Person(string FirstName, string LastName, int Age) with;

构造函数和初始化

记录类型自动生成构造函数,可以直接通过属性初始化:

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

相等性比较

记录类型根据值进行相等比较:

var person1 = new Person("John", "Doe", 30);
var person2 = new Person("John", "Doe", 30);
Console.WriteLine(person1 == person2); // 输出: True

自定义方法和成员

可以在记录类型中添加自定义方法和成员:

public record Person(string FirstName, string LastName, int Age)
{public string FullName => $"{FirstName} {LastName}";
}

属性访问器

默认情况下,记录类型的属性是只读的。如果需要自定义属性行为,可以显式定义属性:

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

使用 init 访问器可以在初始化对象时设置值,但之后不能修改。

继承和派生

记录类型可以继承其他记录类型,派生记录类型会继承基记录类型的属性和方法。

public record Person(string FirstName, string LastName, int Age);
public record Employee(string FirstName, string LastName, int Age, string EmployeeId) : Person(FirstName, LastName, Age);

使用场景

  • 数据传输对象(DTO):记录类型非常适合用来表示数据传输对象,因为它们专注于数据的表示和传输。
  • 不可变数据结构:在需要不可变数据的情况下,记录类型提供了方便的不可变性支持。
  • 配置对象:记录类型可以用来表示应用程序的配置选项,因为它们易于创建和比较。

示例代码

public record Person(string FirstName, string LastName, int Age)
{public string FullName => $"{FirstName} {LastName}";
}class Program
{static void Main(){var person1 = new Person("John", "Doe", 30);var person2 = new Person("John", "Doe", 30);var person3 = new Person("Jane", "Doe", 25);Console.WriteLine(person1 == person2); // TrueConsole.WriteLine(person1 == person3); // FalseConsole.WriteLine(person1.FullName); // John Doe}
}

相关文章:

c# Record关键字

在 C# 9.0 中引入了 record 关键字,用于定义记录类型(Record Types)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相等性比较、生成属性和方法等功能,使得编写数据类更加简洁和高效。 …...

高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程

前言 Nginx WebUI 是一个为 Nginx 提供图形化管理界面的工具。通过 WebUI,用户可以轻松管理 Nginx 配置,而无需直接编辑配置文件,尤其适合新手用户和频繁修改配置的场景。 官网文档:nginxWebUI - 文档 本文将分享为什么选择 ngin…...

家政预约小程序04活动管理表结构设计

目录 1 创建活动表2 创建活动规则表3 创建活动参与记录表总结 为了满足我们日常的营销,我们通常需要搞一些活动,比如满减、折扣、团购等。启动活动后,会在首页进行显示,当用户访问小程序的时候,就可以参与活动&#xf…...

谷歌浏览器的在线存储功能使用方法

谷歌浏览器不仅是目前全球使用最广泛的网络浏览器之一,它还集成了许多实用的功能来提升用户体验。其中,谷歌浏览器的在线存储功能允许用户将数据保存在云端,实现跨设备的无缝同步和共享。本文将详细介绍如何在谷歌浏览器中使用这一功能。 一、…...

HT-HaiBOX边缘计算盒 智慧工厂方案,智慧医疗方案,智慧加油站方案,智慧安防方案,智慧城市方案;方案定制开发

背景介绍 在当今数字化时代,各个行业对于智能化视频监控设备的需求日益增长。无论是安防监控,还是智慧工厂、智慧城市等领域,都需要高效、智能的设备来保障安全和提高生产效率。然而,传统的视频监控设备存在诸多痛点:…...

回调机制实现观察者模式

观察者设计模式,允许对象在状态变化时通知其他依赖对象,通常通过回调函数实现。 在回调机制中,可以注册多个回调函数,以便在特定事件发生时依次调用它们。下面是一个示例,展示如何在 C 中实现一个简单的事件管理器&am…...

并发编程系列(一) -多线程技术快速入门

最近对 Java 并发编程技术知识进行了重新整理,再次献上文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 并发编程系列(一) -多线程技术快速入门并发编程系列(二) -Thread类介绍并发编程系列(三) -synchronized关键字介绍并发编程系列(四) -v…...

单元测试入门和mockup

Java 新手入门:Java单元测试利器,Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式,学一下单测思路 这个没有动态代理,所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…...

蓝桥杯(Java)(ing)

Java前置知识 输入流: (在Java面向对象编程-CSDN博客里面有提过相关知识------IO流) // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new…...

【Linux-多线程】线程互斥(锁和它的接口等)

一、线程互斥 我们把多个线程能够看到的资源叫做共享资源,我们对共享资源进行保护,就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题,下面是一个抢票的代码,共计票数10000张,4个线程去抢 之前我们展示过封…...

[江科大STM32] 第五集快速建立STM32工程模板——笔记

保存,进去选芯片型号,我们是F10C8T6 一个MD,还有所有.c.h 这里所有文件 这里所有文件...

流水线并行举例说明;GPU 的细粒度问题

GPU 的细粒度与模型并行和流水线并行关系 使用模型并行和流水线并行之后会涉及到一个模型切分细粒度的问题,先切分多头(并行执行),每一个多头在切分不同阶段(串行执行)。这种情况下GPU的细粒度是多少 在这种模型并行和流水线并行结合且按多头和阶段切分的情况下,GPU 的…...

如何确保Kafka集群的高可用?

大家好,我是锋哥。今天分享关于【如何确保Kafka集群的高可用?】面试题。希望对大家有帮助; 如何确保Kafka集群的高可用? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 要确保 Kafka 集群 的高可用性,需要…...

计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

Oracle SqlPlus常用命令简介

参考资料 【SQL*Plus】SETシステム変数の設定前後の具体例 目录 一. 执行系命令1.1 执行系统命令1.2 执行sql脚本文件1.2.1 在数据库中执行sql脚本1.2.2 通过sqlplus执行sql脚本 二. show命令2.1 显示SqlPlus中的全部环境变量2.2 显示指定环境变量的设置 三. 时间显示3.1 set …...

8.若依系统监控与定时任务

帮助开发者和运维快速了解应用程序的性能状态。 数据监控 定时任务 实现动态管理任务。 需求:每间隔5s,控制台输出系统时间。 新建的任务类必须在指定目录ruoyi-quartz模块下的task包下。 状态设置为启动 执行策略 场景:比如一个任务每个…...

《计算机组成及汇编语言原理》阅读笔记:p160-p176

《计算机组成及汇编语言原理》学习第 12 天,p160-p176 总结,总计 17 页。 一、技术总结 1.PowerPC (1)programming model(mode) As in most modern computers, there are at least two separate views of the system (formally called programming m…...

TCP网络编程(三)—— 客户端的编写/服务器端和客户端的通信

上篇文章我们学习了TCP的服务器端模式的编写,这篇文章我们将开始编写客户端的代码,完成服务器端和客户端的通信。完整代码和演示在文章的后面。 和服务器端不同,在客户端我们只需要服务器端的套接字和服务器端的地址和端口,用于向…...

如何在谷歌浏览器中使用自定义模板

作为最常用的网络浏览器之一,谷歌浏览器不仅提供了强大的功能,还允许用户通过各种方式自定义其外观和功能。其中,使用自定义模板可以极大地提升用户体验,无论是更改浏览器的外观还是优化网页显示效果。本文将详细介绍如何在谷歌浏…...

Day2 微服务 网关路由转发、网关登录校验、配置管理

目录 1.网关路由转发 1.1 网关 1.2 快速入门 1.2.1 创建项目 1.2.2 引入依赖 1.2.3 启动类 1.2.4 配置路由 1.2.5 测试 1.3 路由过滤 2.网关登录校验 2.1 鉴权思路分析 2.2 网关过滤器 2.3 自定义过滤器 2.3.1 自定义GatewayFilter 2.3.2 自定义GlobalFilter 2.4 登录校验 2.4.…...

嵌入式系统引导程序uboot原理与应用详解

1. 为什么嵌入式系统需要uboot1.1 计算机系统启动的基本原理任何计算机系统启动时都需要一个引导程序来完成硬件初始化和操作系统加载的工作。无论是PC机还是嵌入式设备,这个基本原理都是相通的。在PC架构中,这个引导程序叫做BIOS(基本输入输…...

Skills 系统——让 AI 秒变专家

1. 技能的本质:提示词工程 在 nanobot 中,一个技能就是一个文件夹,核心是里面的 SKILL.md。 nanobot内置的skills放在project_path/nanobot/skills目录下,用户自定义的skills放在workspace/.nanobot/skills目录下 以 weather 技…...

新手福音:在快马平台用AI生成openclaw命令实操案例,轻松入门运维自动化

作为一个刚接触运维的新手,第一次看到openclaw这个命令时确实有点懵。不过最近在InsCode(快马)平台上发现了一个超实用的功能,可以通过AI直接生成可运行的openclaw示例代码,还能实时测试效果,简直是新手福利!下面我就用…...

SMU Debug Tool完全指南:AMD Ryzen硬件调试的终极解决方案

SMU Debug Tool完全指南:AMD Ryzen硬件调试的终极解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…...

C++资源控制哲学:从push_back与emplace_back看左值右值

一、从问题开始std::vector<Person> people; Person bob("bob", 22);people.push_back(bob); // 左值 people.push_back(Person("alice", 25)); // 右值 people.emplace_back("charlie", 30); // 直接构造为什么需要这么多插入…...

别再只盯着报点率了:聊聊电容触摸屏算法里那些不为人知的‘软实力’

电容触摸屏算法的隐秘战场&#xff1a;超越报点率的技术博弈 在智能家居面板的清晨唤醒中&#xff0c;工业HMI产线的精准操控里&#xff0c;或是车载中控的流畅滑动间&#xff0c;电容触摸屏已成为人机交互的核心界面。当大多数技术选型讨论聚焦于报点率、触控精度这些硬指标时…...

2026最权威的五大降重复率网站横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 需从词汇、句式跟逻辑这三方面来着手&#xff0c;以求降低AI生成内容的可识别性。于词汇方面…...

明日方舟基建自动化:从手动操作到智能管理的进阶指南

明日方舟基建自动化&#xff1a;从手动操作到智能管理的进阶指南 【免费下载链接】arknights-mower 《明日方舟》长草助手 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower 作为《明日方舟》玩家&#xff0c;你是否也曾面临这样的困境&#xff1a;每天花费…...

解锁3大核心能力:Path of Building完全掌握指南

解锁3大核心能力&#xff1a;Path of Building完全掌握指南 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding Path of Building&#xff08;简称PoB&#xff09;作为《流放…...

ai辅助开发:让快马智能体为你规划与优化openclaw本地部署方案

AI辅助开发&#xff1a;让快马智能体为你规划与优化OpenClaw本地部署方案 最近在尝试本地部署OpenClaw项目时&#xff0c;发现这个任务远比想象中复杂。作为一个资源有限的小型开发者&#xff0c;如何在有限的GPU内存环境下运行这个项目成了大难题。好在发现了InsCode(快马)平…...