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

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); // True
        Console.WriteLine(person1 == person3); // False

        Console.WriteLine(person1.FullName); // John Doe
    }
}

http://www.kler.cn/a/461378.html

相关文章:

  • 安卓11 SysteUI添加按钮以及下拉状态栏的色温调节按钮
  • Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)
  • overleaf写学术论文常用语法+注意事项+审阅修订
  • 《深度学习梯度消失问题:原因与解决之道》
  • js的一些处理
  • Git的使用流程(详细教程)
  • Github 正常访问但是ping不同也无法进行git操作
  • 通过无障碍服务(AccessibilityService)实现Android设备全局水印显示
  • Docker 搭建 Gogs
  • SpringBoot 实现登录功能
  • 书生·浦语大模型全链路开源体系-第9关 LMDeploy 量化部署进阶实践
  • TB1801D 线性驱动 LED 恒流芯片
  • 苹果系统MacOS下采用ObjectC访问opencv加载图片的一个简单实例
  • Flink的多流转换(分流-侧输出流、合流-union、connect、join)
  • 中华人民共和国网络安全法
  • BOE(京东方)“向新2025”年终媒体智享会落地深圳
  • 关于MCU复位电路的分析与设计
  • Java重要面试名词整理(十二):Netty
  • C++ Brain Teasers: 未指定和实现定义的行为-函数参数的求值顺序
  • 网络安全靶场合集:知识点与功能解析
  • 数据可视化-1:使用Matplotlib绘制多种图表
  • 手机租赁平台开发助力智能设备租赁新模式
  • 机器学习、深度学习、神经网络之间的关系
  • (推荐)【通用业务分发架构】1.业务分发 2.rpc调用 3.Event事件系统
  • win32汇编环境下,窗口程序中生成listview列表控件及显示
  • 深度学习day6|用pytorch实现VGG-16模型人脸识别