C# 下记录(Record)详解

在C# 9.0中,引入了一个新的关键字:record。record关键字用于定义记录类型,这是一种不可变的数据结构,用于表示具有明确字段名称和类型的数据集。本文将详细介绍C#中record类型的使用和特点,以及如何通过记录记录器(如Console.WriteLine)与用户输入进行互动。

1. 记录(Record)的基本概念

记录类型是一种不可变的数据结构,它由字段组成,每个字段都有明确的名字和类型。在C#中,record类型提供了一种快捷的方式来创建具有明确字段名称和类型的数据集。record类型的定义如下:

public record RecordType(FieldType1 field1, FieldType2 field2, ...);

其中,RecordType是记录类型的名称,FieldType1、FieldType2等是字段的类型,字段之间用逗号分隔。

2. 记录(Record)的特点

record类型具有以下特点:

  • 不可变性:record类型一旦创建,其字段的值就不能被修改。这意味着record类型是一个值类型,而不是引用类型。
  • 明确字段名称:record类型的字段名称在记录类型中是唯一的,这使得记录类型的使用更加清晰和易于理解。
  • 简洁性:record类型允许你快速地定义具有明确字段名称和类型的数据集,而无需编写额外的代码。
  • 自动实现属性:record类型会自动为每个字段生成一个私有字段,并为其提供一个公共属性,方便进行字段值的访问和赋值。

3. 不同类型的记录

C#中的record类型可以用于表示不同类型的数据集。以下是一些常见的record类型示例:

// 表示个人信息的record类型
public record Person(string Name, int Age);// 表示订单信息的record类型
public record Order(string ProductName, decimal Price, int Quantity);// 表示日期和时间的record类型
public record DateTimeRecord(DateTime Date, TimeSpan Time);

在这些示例中,我们定义了用于表示个人信息、订单信息和日期时间的record类型。

4. 记录记录器(如Console.WriteLine)的使用方法

记录记录器是一种用于记录数据的方法,它可以将记录的字段值输出到控制台或其他输出设备。在C#中,你可以使用Console.WriteLine方法作为记录记录器。

下面是一个使用record类型和Console.WriteLine记录记录实例的示例:

// 定义一个record类型
public record Person(string Name, int Age);// 使用record类型创建记录实例
Person person = new Person("张三", 30);// 使用Console.WriteLine记录记录实例
Console.WriteLine($"姓名:{person.Name}, 年龄:{person.Age}");

在这个例子中,我们定义了一个Person record类型,并使用Console.WriteLine方法输出了记录实例的字段值。

5. 与用户输入的互动

你可以使用record类型与用户输入进行互动,例如,创建一个用于输入和显示个人信息的程序。以下是一个简单的示例:

// 定义一个record类型
public record Person(string Name, int Age);// 用户输入记录实例的字段值
Console.Write("请输入姓名:");
string name = Console.ReadLine();
Console.Write("请输入年龄:");
int age = int.Parse(Console.ReadLine());// 使用用户输入的字段值创建记录实例
Person person = new Person(name, age);// 使用Console.WriteLine记录记录实例
Console.WriteLine($"姓名:{person.Name}, 年龄:{person.Age}");

在这个例子中,我们使用Console.ReadLine方法获取用户输入的姓名和年龄,并使用这些输入值创建了一个Person record类型的实例。然后,我们使用Console.WriteLine方法输出了记录实例的字段值。

6. 记录示例代码

下面是一个完整的记录示例,它定义了一个表示学生信息的record类型,并使用用户输入和记录记录器与用户互动:

using System;public record Student(string Name, int Age, string Major);public class Program
{public static void Main(string[] args){// 用户输入记录实例的字段值Console.Write("请输入学生姓名:");string name = Console.ReadLine();Console.Write("请输入学生年龄:");int age = int.Parse(Console.ReadLine());Console.Write("请输入学生专业:");string major = Console.ReadLine();// 使用用户输入的字段值创建记录实例Student student = new Student(name, age, major);// 使用Console.WriteLine记录记录实例Console.WriteLine($"姓名:{student.Name}, 年龄:{student.Age}, 专业:{student.Major}");}
}

在这个例子中,我们定义了一个Student record类型,它有三个字段:Name、Age和Major。然后,我们使用Console.ReadLine方法获取用户输入的姓名、年龄和专业,并使用这些输入值创建了一个Student record类型的实例。最后,我们使用Console.WriteLine方法输出了记录实例的字段值。

7. 记录(Record)与类(Class)的区别

虽然record类型和类都可以用来表示具有明确字段名称和类型的数据集,但它们之间存在一些区别:

  • 不可变性:record类型是不可变的,而类是可变的。这意味着一旦record类型创建,其字段的值就不能被修改;而对于类,你可以修改其字段的值。
  • 自动实现属性:record类型会自动为每个字段生成一个私有字段和一个公共属性,而类需要你手动为每个字段编写get和set方法。
  • 性能:由于record类型是不可变的,它在某些情况下可能比类具有更好的性能,例如,当你不需要修改记录实例的字段值时。

8.record类型实现接口

在C#中,记录类型本身是不支持实现接口的。记录类型被设计得简单、轻量,并且不支持传统意义上的继承。这意味着您无法直接在记录类型上实现接口。但是,您可以通过使用记录类型和类的组合来实现类似的功能。您可以采用以下方法:

  1. 定义仅包含必要字段的记录类型。
  2. 创建一个实现所需接口并具有记录类型属性的类。
  3. 使用该类作为记录类型的包装器来提供接口实现。

下面是一个例子来说明这一点:

using System;
using System.Collections.Generic;
using System.Linq;public interface IEntity
{int Id { get; set; }string Name { get; set; }
}public record Person(string Name, int Age);public class EntityWrapper : IEntity
{public int Id { get; set; }public string Name { get; set; }public EntityWrapper(int id, string name){Id = id;Name = name;}public Person AsRecord(){return new Person(Name, Id);}
}public class Program
{public static void Main(){EntityWrapper entityWrapper = new EntityWrapper(1, "Alice");IEntity entity = entityWrapper.AsRecord();Console.WriteLine($"Id: {entity.Id}, Name: {entity.Name}");}
}

在此示例中,我们有一个具有两个属性的 IEntity 接口:Id 和 Name。我们定义一个包含“姓名”和“年龄”字段的人员记录类型。然后,我们创建一个 EntityWrapper 类,该类实现 IEntity 并具有 Person 类型的属性。EntityWrapper 类通过包装记录类型来提供接口实现。这种方法允许您使用记录类型的轻量级和不可变属性,同时仍然能够实现应用程序逻辑所需的接口。

9. 结论

C#中的record类型是一种简洁、易用且具有明确字段名称和类型的不可变数据结构。它提供了快速定义数据集的途径,并具有自动实现属性的特点。record类型可以用于表示不同类型的数据集,并与用户输入进行互动。通过使用record类型和记录记录器(如Console.WriteLine),你可以更方便地处理和输出记录实例的字段值。掌握record类型的使用,可以使你的C#编程更加高效和简洁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云计算】云数据中心网络(六):私网连接

《云网络》系列,共包含以下文章: 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络(一):VPC云数据中心网络(二):弹性公网 IP云数据中心网络(三)…

深度学习基础——卷积神经网络的感受野、参数量、计算量

深度学习基础——卷积神经网络的感受野、参数量、计算量 深度学习在图像处理领域取得了巨大的成功,其中卷积神经网络(Convolutional Neural Networks,CNN)是一种非常重要的网络结构。本文将介绍卷积神经网络的三个重要指标&#…

网络安全产品---扛DDOS产品

DDOS攻击 what 分布式拒绝服务攻击(Distributed Denial of Service attack) how 攻击者通过控制大量的网络设备(傀儡机),向攻击目标(例如网站、Web服务器、网络设备等)发出海量的、但并不是…

SQLite R*Tree 模块(三十三)

返回:SQLite—系列文章目录 上一篇:SQLite FTS3 和 FTS4 扩展(三十二) 下一篇:SQLite轻量级会话扩展(三十四) 1. 概述 R-Tree 是一个特殊的 专为执行范围查询而设计的索引。R-树最常见的是 用于地理空间系统,其中…

前端三剑客 HTML+CSS+JavaScript ① 基础入门

光永远会照亮你 —— 24.4.18 一、C/S架构和B/S架构 C:Client(客户端) B:Browser(浏览器) S:Server(服务器) C/S 架构: B/S 架构: 大型专业应用、安全性要求较高的应用,还…

binary tree Leetcode 二叉树算法题

144.二叉树的前序遍历 前序遍历是&#xff1a;根-左-右 所以记录序列的的时候放在最前面 递归 class Solution {List<Integer> ans new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {if(root null) return ans;ans.add(root…

【HCIP】OSPF的高级特性

OSPF的高级特性1 --- 不规则区域 一、OSPF不规则区域类型 产生原因&#xff1a;区域划分不合理&#xff0c;导致的问题 1、非骨干区域无法和骨干区域保持连通 2、骨干区域被分割 造成后果&#xff1a;非骨干区域没和骨干区域相连&#xff0c;导致ABR将不会帮忙转发区域间的路由…

【数据结构练习题】堆——top-k问题

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ ♥♥♥♥♥上一章&#xff1a;【数据结构练习题】二叉树(1)——1.相同的树2.另一颗树的子树3.翻转二叉树4.平衡二叉树5.对称二叉树♥♥♥♥♥ 文章目录 1.top-k问题1.1问题描述1.2思路分析1.3绘图分析…

理光打印机设置扫描文件到共享文件夹教程(线上和现场)

在线设置。 1.点击用户工具/计数器按钮。 2.点击系统设置。 3.点击端口设置&#xff0c;点击机器IPV4地址。 4.获得打印机IP地址。 5.回到共享电脑&#xff0c;新建一个账户或者使用当前账户&#xff0c;为了隐私安全起见&#xff0c;最好设置密码。 6.关闭防火墙。 7.启用…

Mac 下安装PostgreSQL经验

使用homebrew终端软件管理器去安装PostgreSQL 如果没有安装brew命令执行以下命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 沙果开源物联网系统 SagooIoT | SagooIoT 1.使用命令安装postgreSQL brew i…

QC、QA、SQC、SQA

QC 品质控制/质量控制&#xff08;QC即英文Quality Control的简称&#xff0c;中文意义是品质控制&#xff09;其在ISO8402&#xff1a;1994的定义是“为达到品质要求所采取的作业技术和活动”。有些推行ISO9000的组织会设置这样一个部门或岗位&#xff0c;负责ISO9000标准所要…

JavaScript之分时函数、分时间段渲染页面、提高用户体验、参数归一化、高阶函数、分段、appendChild、requestIdleCallback

MENU 前言效果图html原始写法优化方式一(参数归一化)优化方式二(当浏览器不支持requestIdleCallback方法的时候)优化方式三(判断环境) 前言 当前需要向页面插入十万个div元素&#xff0c;如果使用普通的渲染方式&#xff0c;会造成延迟。这时候就需要通过分时函数来实现渲染了。…

JAVAEE初阶之计算机如何工作

1.一台机器如何组成 冯诺依曼体系 CPU 中央处理器: 进行算术运算和逻辑判断.存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)输入设备: 用户给计算机发号施令的设备.输出设备: 计算机个用户汇报结果的设备. 针对存储空间 硬盘 > 内存 >> CPU针对数据访问…

【Pytorch】VSCode实用技巧 - 默认终端修改为conda activate pytorch

VScode修改配置使得启动终端为conda环境 文章目录 VScode修改配置使得启动终端为conda环境1、找到settings.json 文件2、查找 conda / mamba 相关内容3、编辑 settings.json 文件4、异常处理5、补充检验 VScode跑项目&#xff0c;在启动pytorch项目时往往会有千奇百怪的问题&am…

大学生前端学习第一天:了解前端

引言&#xff1a; 哈喽&#xff0c;各位大学生们&#xff0c;大家好呀&#xff0c;在本篇博客&#xff0c;我们将引入一个新的板块学习&#xff0c;那就是前端&#xff0c;关于前端&#xff0c;GPT是这样描述的&#xff1a;前端通常指的是Web开发中用户界面的部分&#xff0c;…

数据库设计的三范式

简单来说就是&#xff1a;原子性、唯一性、独立性 后一范式都是在前一范式已经满足的情况进行附加的内容 第一范式&#xff08;1NF&#xff09;&#xff1a;原子性 存储的数据应不可再分。 不满足原子性&#xff1a; 满足原子性&#xff1a; 第二范式&#xff08;2NF&#xf…

Flutter 中的 Crypto 库介绍及使用

简介 Crypto 库是 Dart 标准库的一部分&#xff0c;提供了一系列用于加密和哈希的函数。它支持多种算法&#xff0c;包括 SHA-1、SHA-256、MD5 和 AES。Crypto 库可用于各种安全操作&#xff0c;例如&#xff1a; 存储敏感数据的安全哈希值验证数据完整性加密和解密数据 安装…

探索设计模式的魅力:开启智慧之旅,AI与机器学习驱动的微服务设计模式探索

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索AI与机器学习驱动的微服务设计模式之旅✨ 亲爱的科技爱好者们&#xff0c;有没…

LabVIEW多设备控制与数据采集系统

LabVIEW多设备控制与数据采集系统 随着科技的进步&#xff0c;自动化测试与控制系统在工业、科研等领域的应用越来越广泛。开发了一种基于LabVIEW平台开发的多设备控制与数据采集系统&#xff0c;旨在解决多设备手动设置复杂、多路数据显示不直观、数据存储不便等问题。通过RS…

【记录】Python3|Selenium 下载 PDF 不预览不弹窗(2024年)

版本&#xff1a; Chrome 124Python 3.12Selenium 4.19.0 版本与我有差异不要紧&#xff0c;只要别差异太大比如 Chrome 用 57 之前的版本了&#xff0c;就可以看本文。 如果你从前完全没使用过、没安装过Selenium&#xff0c;可以参考这篇博客《【记录】Python3&#xff5c;Se…