c# Record关键字
在 C# 9.0 中引入了 record
关键字,用于定义记录类型(Record Types)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相等性比较、生成属性和方法等功能,使得编写数据类更加简洁和高效。
基本概念
- 不可变性:记录类型默认是不可变的,这意味着它们的属性是只读的,不能被修改。
- 相等性:记录类型根据其值进行相等比较,而不是引用比较。
- 自动化成员:记录类型可以自动生成构造函数、属性、
ToString
、Equals
和GetHashCode
方法。
声明记录类型
记录类型的声明非常简洁,基本语法如下:
public record Person(string FirstName, string LastName, int Age);
这会生成一个包含 FirstName
、LastName
和 Age
属性的记录类型,并自动提供构造函数、ToString
、Equals
和 GetHashCode
方法。
不可变性和可变性
- 不可变记录:默认情况下,记录类型是不可变的,属性是只读的。例如:
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)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相等性比较、生成属性和方法等功能,使得编写数据类更加简洁和高效。 …...
Windows 10 自带功能实现大屏、小屏无线扩展
一、添加可选功能 在作为无线投屏对象的「第二屏」设备上,打开 Windows 10 设置并定位至「应用 > 应用和功能」界面,然后点击右侧界面中的「可选功能」选项。 点击可选功能界面顶部的「添加功能」按钮,搜索「无线显示器」模块并选择添加。…...
Python内存管理揭秘:有效避免内存泄漏,提升程序稳定性
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代软件开发中,内存管理是确保程序高效、稳定运行的关键因素之一。尽管Python凭借其自动垃圾回收机制简化了内存管理,但内存泄漏问题仍…...
论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试
大语言模型拥有的强大能力可以用来辅助多种工作,但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz,它利用模型提示生成模糊测试驱动代码,并将代码片段嵌入到LLVM框架中执行模糊测试。 论文摘要 制作高质…...
网工日记:FTP两种工作模式的区别
FTP 的主动模式和被动模式在连接建立的发起方、数据传输端口以及对网络环境的适应性等方面存在明显区别: 1. 连接发起方 主动模式:数据连接由服务器主动发起。在控制连接建立后,客户端通过 PORT 命令告知服务器自己用于接收数据的临时端口号…...
clickhouse-backup配置及使用(Linux)
一、下载地址 Releases Altinity/clickhouse-backup GitHub 二、上传到服务器解压安装 自行上传至服务器,解压命令: tar xvf clickhouse-backup-linux-amd64.tar.gz 三、创建软连接 sudo ln -sv build/linux/amd64/clickhouse-backup /usr/local/bin/…...
【每日学点鸿蒙知识】模拟器开启网络、长时任务、兼容性测试支持、丢帧定位、SO中访问rawfile等
1、模拟器如何开启网络? 模拟器使用的是电脑本身的网络,不通过代理即可访问网络。 2、创建子window后,锁屏很短时间内,应用会被杀死? 没开长时任务,锁屏和退后台保活要开长时任务。 应用退至后台后&…...
Python 将文字和二维码 生成到BMP上 可以做标签打印等
直接上代码吧,都有注释,看得明白 将代码复制到main.py文件中,就可以调试了 from PIL import Image, ImageDraw, ImageFont import matplotlib.font_manager as fm from matplotlib.font_manager import FontProperties import os import qr…...
pat 乙级1096 大美数
若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。 输入格式: 输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过…...
INT303 Big Data Analytics 笔记
Lecture1 Introduction 不考! “Data Mining is the study of collecting, processing, analyzing, and gaining useful insights from data” EXPLORATORY ANALYSIS Make measurements to understand what the data looks like first steps when collecting da…...
Git 解决 everything up-to-date
首先使用git log查看历史提交,找到最新一次提交,比如: PS D:\Unity Projects\CoffeeHouse\CoffeeHouse_BurstDebugInformation_DoNotShip> git log commit a1b54c309ade7c07c3981d3ed748b0ffac2759a3 (HEAD -> master, origin/master)…...
初级算法 - 数组简介
数组简介 在TypeScript中,数组是一种存储同一类型数据的集合类型。数组可以动态调整长度,支持对元素进行增删改查等操作。通过类型注解,可以更清晰地约束数组中元素的类型,提升代码的可维护性。 创建数组的方式 1. 使用字面量方式…...
【毕业设计选题】目标检测方向毕业设计选题推荐 2025
目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…...
适配器模式详解
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户所期望的另一个接口,使得原本不兼容的类能够协同工作。这种模式的主要目的是解决接口不匹配的问题,它通过创建一个适配器类ÿ…...
基于 Spring 的自定义注解和请求拦截器实现认证机制
基于 Spring 的自定义注解和请求拦截器实现认证机制 一、基于 Spring 的自定义注解和请求拦截器实现认证机制1. 背景2. 业务场景3. 核心实现3.1 定义自定义注解 IgnoreAuth3.2 定义请求拦截器 AuthInterceptor3.3 配置拦截器3.4 登录接口 4. 小结 一、基于 Spring 的自定义注解…...
Java编程规约:集合处理
文章目录 I 集合处理【强制】【推荐】II 知识扩展I 集合处理 【强制】 不要在 foreach 循环里进行元素的 remove / add 操作。remove 元素请使用 iterator 方式,如果并发操作,需要对 iterator 对象加锁。// 正例: List<String> list = new ArrayList<>(...
python使用PyQt5,整套,桌面应用
安装 安装 pip install PyQt55.7.1 pip install PyQtWebEngine1、创建窗口,按百分比划分 from PyQt5.QtGui import QGuiApplication from PyQt5.QtWidgets import QApplication, QWidget # 创建应用程序实例 app QApplication([]) # 创建主窗口 window QWidget(…...
机械臂的各种标定
文章目录 1. 工具坐标系标定2. 工具手标定3. 手眼标定联系 在工程中,同时使用工具坐标系标定、工具手标定和手眼标定的概念、目的和作用如下: 1. 工具坐标系标定 概念: 工具坐标系标定是指确定工具相对于机器人坐标系的位置和姿态关系的过程…...
金融租赁系统助力企业转型与市场竞争力提升
内容概要 在现代商业环境中,金融租赁系统不仅是一个简单的工具,而是企业转型的重要推动力。通过优化业务流程,提升自动化水平,它帮助企业在复杂的市场中找到自己的立足之地。想象一下,一个企业在使用传统方法时&#…...
正则表达式 - 运算符优先级
正则表达式 - 运算符优先级 正则表达式(Regular Expression,简称Regex)是一种用于处理字符串的强大工具,它通过特定的语法规则来匹配、查找和替换文本中的特定模式。在正则表达式中,运算符的优先级决定了表达式各部分的处理顺序,这对于正确理解和编写正则表达式至关重要…...
【python】unittest单元测试
文章目录 基本使用不同启动方式的区别 基本使用 下面是根据文档写的一个demo,主要的内容基本都包含了,使用时导入自己的业务类测试类中的方法就行。 import unittest# 测试类不强制test开头,仅作为规范。但必须继承unittest.TestCase class…...
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7817897.html?templateId1718516 以gis表为例: drop table gis; create table gis(id number not null, pos st_geometry not null); 使用如下的java代码片断,…...
基于 LangChain 实现数据库问答机器人
基于 LangChain 实现数据库问答机器人 一、简介二、应用场景三、实战案例1、需求说明2、实现思路3、对应源码 一、简介 在 Retrieval 或者 ReACT 的一些场景中,常常需要数据库与人工智能结合。而 LangChain 本身就封装了许多相关的内容,在其官方文档-SQ…...
XIAO ESP32 S3网络摄像头——2视频获取
本文主要是使用XIAO Esp32 S3制作网络摄像头的第2步,获取摄像头图像。 1、效果如下: 2、所需硬件 3、代码实现 3.1硬件代码: #include "WiFi.h" #include "WiFiClient.h" #include "esp_camera.h" #include "camera_pins.h"// 设…...
图像描述/字幕开源模型与数据集全览
图像描述/字幕(Image Captioning)是用文字描述图像内容的任务,属于计算机视觉和自然语言处理的交叉领域。大多数图像描述系统采用编码器-解码器(encoder-decoder)框架,其中输入图像被编码为中间表示形式&am…...
关于UE加载osgb数据的研究(一)
最近关于倾斜数据在UE中加载显示的问题,直接转换格式本地加载的方式避免了数据延迟加载、缓存加载,动态刷新等问题,但是也暴露了突出的问题:常规的模型格式会丢失掉倾斜数据的lod,致使效果缺失。 故而需要深入研究一下UE加载osgb数据的方式方法。 首先,我们需得学习一下…...
Hypervisor 的两种类型
文章目录 一、定义 Hypervisor(也被称为虚拟机监视器,即Virtual Machine Monitor,VMM)是一种创建和运行虚拟机的软件、固件或硬件。它可以在物理主机上划分出多个虚拟的计算环境,使得多个操作系统(Guest Op…...
07-ArcGIS For JavaScript--隐藏参数qualitySettings(memory和lod控制)
目录 1、综述2、sceneview.qualitySettings2.1、sceneview.qualitySettings.memoryLimit2.2、lodFactor2.3 additionalCacheMemory 3、结论 1、综述 先上重点,SceneView.qualitySettings为隐藏对象参数,该对象的memoryLimit和lodFactor等值,…...
内训宝企业培训平台 upload/scorm 文件上传致RCE漏洞复现
0x01 产品简介 内训宝企业培训平台是一款专注于企业内部培训的在线平台,由北京内训宝科技有限公司开发并提供服务。旨在为企业提供全方位、个性化的内部培训解决方案。通过该平台,企业可以轻松地组织和管理内部培训活动,提升员工的专业技能和综合素质,进而增强企业的竞争力…...
js按日期按数量进行倒序排序,然后再新增一个字段,给这个字段赋值 10 到1
效果如下图: 实现思路: 汇总数据:使用 reduce 方法遍历原始数据数组,将相同日期的数据进行合并,并计算每个日期的总和。创建日期映射:创建一个映射 dateMap,存储每个日期的对象列表。排序并添加…...
[2025] 如何在 Windows 计算机上轻松越狱 IOS 设备
笔记 1. 首次启动越狱工具时,会提示您安装驱动程序。单击“是”确认安装,然后再次运行越狱工具。 2. 对于Apple 6s-7P和iPad系列(iOS14.4及以上),您应该点击“Optinos”并勾选“允许未经测试的iOS/iPadOS/tvOS版本”&…...
修改表字段属性,SQL总结
MYSQl varchar转为mediumtext ALTER TABLE table_name MODIFY COLUMN column_name mediumtext; ALTER TABLE table_name MODIFY COLUMN column_name varchar(255) 1. 修改字段的数据类型 使用 MODIFY COLUMN 可以改变字段的数据类型、长度、默认值或注释,但不会更…...
艾体宝产品丨加速开发:Redis 首款 VS Code 扩展上线!
Redis 宣布推出其首款专为 VS Code 设计的 Redis 扩展。这一扩展将 Redis 功能直接整合进您的集成开发环境(IDE),旨在简化您的工作流程,提升工作效率。 我们一直致力于构建强大的开发者生态系统,并在您工作的每一步提…...
PHP 中的魔术常量
概述 PHP提供了9个魔术常数,您可以在PHP应用程序代码中使用。它们是“神奇的”,因为它们是在编译时定义的,不像常规常量(您可以自己定义)是在运行时定义的。这意味着它们的值可以根据它们在代码中的使用位置而更改。 …...
培训机构Day20
今天还是讲一些基本的js知识点。 知识点: html css :框架结构 样式修饰 javascript:行为交互,动态效果。有逻辑的语言。动态脚本语言。无需编译,解释执行。 寄生在网页上执行。浏览器内核自带js解释器。 js引入三…...
Day62 图论part11
Floyd 算法精讲 Floyd 算法代码很简单,但真正理解起原理 还是需要花点功夫,大家在看代码的时候,会发现 Floyd 的代码很简单,甚至看一眼就背下来了,但我为了讲清楚原理,本篇还是花了大篇幅来讲解。 代码随想…...
【Golang 面试题】每日 3 题(十三)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
云手机+Facebook:让科技与娱乐完美结合
移动互联网时代,Facebook作为全球最大的社交媒体平台之一,早已成为企业、品牌和组织竞相角逐的营销阵地。而云手机的出现,则为Facebook营销注入了新的活力,其独特的优势让营销活动更加高效、精准且灵活。本文将深入探讨云手机在Fa…...
2024年总结与展望
23年底的时候,和一大批同事一起转到刚成立的合资公司,当时大家都以为会是好的归宿,毕竟外资文化,投了这么多钱,起码两三年内应该是稳定、不内卷的,似乎可以安心工作,安心生活。2024的开头确实挺…...
标准流,浮动,Flex布局
三个 div 盒子在一一行显示,但是 div 标签默认是独占一行的 想要实现块级盒子在一行,两种方法,浮动和 Flex 布局 浮动之后的盒子:顶对齐,行内块显示特点(宽高显示) 浮动的盒子会脱标,…...
2 、什么是Java中的不可变类
在Java中,不可变类(Immutable Class)是指一类其对象一旦创建后,就不能更改其状态(即对象的字段值不能被修改)的类。不可变类提供了一种安全的方式来管理对象,尤其是在并发编程中,能够…...
网络安全技能试题总结参考
对网络安全技能测试相关的试题进行了总结,供大家参考。 一、单选题 1.(单选题)以下属于汇聚层功能的是 A.拥有大量的接口,用于与最终用户计算机相连 B.接入安全控制 C.高速的包交换 D.复杂的路由策略 答案:D 2.(单选题)VLAN划分的方法,选择一个错误选项 A.基于端口…...
基于Python的社交音乐分享平台
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
CP AUTOSAR标准之FlexRayDriver(AUTOSAR_SWS_FlexRayDriver)(更新中……)
1 简介和功能概述 FlexRay驱动程序(Fr)抽象了特定FlexRay通信控制器(CC)的硬件相关实现细节。本规范主要依赖于符合FlexRay规范[13]的FlexRay CC。此外,本规范还支持符合FlexRay规范[14]的旧版FlexRay控制器。本SWS中因支持的FlexRay规范不同而导致的不同行为在适用的情况下以…...
AIDD -人工智能药物设计- DrugChat:多模态大语言模型实现药物机制与属性的全方位预测
DrugChat:多模态大语言模型实现药物机制与属性的全方位预测 今天为大家介绍的是来自加州大学圣地亚哥分校谢澎涛团队的一篇论文。准确预测潜在药物分子的作用机制和性质对于推进药物发现至关重要。然而,传统方法通常需要为每个特定的预测任务开发专门的…...
CP AUTOSAR标准之FlexRayInterface(AUTOSAR_SWS_FlexRayInterface)(更新中……)
1 简介和功能概述 该规范指定了AUTOSAR基础软件模块“FlexRay接口”的功能、API和配置。 在AUTOSAR分层软件架构中,FlexRay接口属于ECU抽象层,或者更准确地说,属于通信硬件抽象。这表明了FlexRay接口的主要任务: 为上层提供FlexRay通信系统的抽象接口。至少就数据传…...
【Linux-多线程】线程互斥(锁和它的接口等)
一、线程互斥 我们把多个线程能够看到的资源叫做共享资源,我们对共享资源进行保护,就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题,下面是一个抢票的代码,共计票数10000张,4个线程去抢 之前我们展示过封…...
当一个服务拆成两个服务的错误
1.老路由信息没有修改,导致一直404...
单元测试入门和mockup
Java 新手入门:Java单元测试利器,Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式,学一下单测思路 这个没有动态代理,所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…...
Android Room 框架的初步使用
一、简介 Room 是一个强大的对象关系映射库,它允许你将 SQLite 数据库中的表映射到 Java 或 Kotlin 的对象(称为实体)上。你可以使用简单的注解(如 Entity、Dao 和 Database)来定义数据库表、数据访问对象(…...