如何在 C# 9 中使用record类型?

原文链接:https://www.infoworld.com/article/3607372/how-to-work-with-record-types-in-csharp-9.html

原文标题:How to work with record types in C# 9

翻译:沙漠尽头的狼(谷歌翻译加持)

利用 C# 9 中的record类型来构建不可变类型和线程安全对象。

不可变性使您的对象线程安全并有助于改进内存管理。它还使您的代码更具可读性和更易于维护。不可变对象被定义为一旦创建就无法更改的对象。因此,不可变对象本质上是线程安全的,并且不受竞争条件的影响。

直到最近,C# 还不支持开箱即用的不可变性。C# 9 通过新的 init-only 属性和record类型引入了对不可变性的支持。仅init-only属性可用于使对象的各个属性不可变,而record可用于使整个对象不可变。

因为不可变对象不会改变它们的状态,所以在多线程和数据传输对象等许多用例中,不可变性是一个理想的特性。本文讨论了我们如何在 C# 9 中使用 init-only 属性和record类型。

要使用本文中提供的代码示例,您应该在系统中安装 Visual Studio 2019。如果您还没有安装,可以在此处下载 Visual Studio 2019[1]

在 Visual Studio 中创建控制台应用程序项目

首先,让我们在 Visual Studio 中创建一个 .NET Core 控制台应用程序项目。假设您的系统中安装了 Visual Studio 2019,请按照下面概述的步骤在 Visual Studio 中创建一个新的 .NET Core 控制台应用程序项目。

  1. 启动 Visual Studio IDE。

  2. 单击“Create new project.”。

  3. 在“Create new project”窗口中,从显示的模板列表中选择“Console App (.NET Core)”。

  4. 点击下一步。

  5. 在接下来显示的“Configure your new project”窗口中,指定新项目的名称和位置。

  6. 单击创建。

遵循这些步骤将在 Visual Studio 2019 中创建一个新的 .NET Core 控制台应用程序项目。我们将在本文的后续部分中使用该项目。

在 C# 9 中使用 init-only 属性

init-only属性是那些只能在对象初始化时赋值的属性。请参阅以下包含 init-only 属性的类。

public class DbMetadata
{public string DbName { get; init; }public string DbType { get; init; }
}

您可以使用以下代码片段创建 DbMetadata 类的实例并初始化其属性。

DbMetadata dbMetadata = new DbMetadata()
{DbName = "Test",DbType = "Oracle"
};

请注意,对 init-only 字段的后续分配是非法的。因此,以下语句将无法编译。

dbMetadata.DbType = "SQL Server";

在 C# 9 中使用record类型

C# 9 中的record类型是仅具有只读属性的轻量级、不可变数据类型(或轻量级类)。因为record类型是不可变的,所以它是线程安全的,并且在创建后不能改变或更改。您只能在构造函数中初始化record类型。

您可以使用 record 关键字声明record,如下面的代码片段所示。

public record Person
{public string FirstName { get; set; }public string LastName { get; set; }public string Address { get; set; }public string City { get; set; }public string Country { get; set; }
}

请注意,仅将类型标记为record(如前面的代码片段所示)本身不会为您提供不可变性。要为您的record类型提供不可变性,您必须使用 init 属性,如下面的代码片段所示。

public record Person
{public string FirstName { get; init; }public string LastName { get; init; }public string Address { get; init; }public string City { get; init; }public string Country { get; init; }
}

您可以使用以下代码片段创建 Person 类的实例并初始化其属性。

var person = new Person
{FirstName = "Joydip",LastName = "Kanjilal",Address = "192/79 Stafford Hills",City = "Hyderabad",Country = "India"
};

在 C# 9 中使用 with 表达式

如果某些属性具有相同的值,您可能经常希望从另一个对象创建一个对象。但是,记录类型的 init-only 属性会阻止这种情况。例如,以下代码片段将无法编译,因为默认情况下名为 Person 的record类型的所有属性都是 init-only

var newPerson = person;
newPerson.Address = "112 Stafford Hills";
newPerson.City = "Bangalore";

幸运的是,有一个解决方法——with 关键字。通过指定属性值的更改,您可以利用 with 关键字从另一个record类型创建一个实例。以下代码片段说明了如何实现这一点。

var newPerson = person with{ Address = "112 Stafford Hills", City = "Bangalore" };

C# 9 中record类型的继承

record类型支持继承。也就是说,您可以从现有record类型创建新record类型并添加新属性。以下代码片段说明了如何通过扩展现有record类型来创建新record类型。

public record Employee : Person
{public int Id { get; init; }public double Salary { get; init; }
}

C# 9 中的位置record

默认情况下,使用位置参数创建的record类型实例是不可变的。换句话说,您可以通过使用构造函数参数传递有序的参数列表来创建record类型的不可变实例,如下面给出的代码片段所示。

var person = new Person("Joydip", "Kanjilal", "192/79 Stafford Hills", "Hyderabad", "India");

在 C# 9 中检查record实例是否相等

在 C# 中检查类的两个实例是否相等时,比较基于这些对象的引用(身份)。但是,如果您检查record类型的两个实例是否相等,则比较基于record类型的实例中的值。

以下代码片段说明了一个名为 DbMetadata 的record类型,它由两个字符串属性组成。

public record DbMetadata
{public string DbName { get; init; }public string DbType { get; init; }
}

以下代码片段显示了如何创建 DbMetadata 记录类型的两个实例。

DbMetadata dbMetadata1 = new DbMetadata()
{DbName = "Test",DbType = "Oracle"
};
DbMetadata dbMetadata2 = new DbMetadata()
{DbName = "Test",DbType = "SQL Server"
};

您可以使用 Equals 方法检查相等性。以下两个语句将在控制台窗口中显示“false”。

Console.WriteLine(dbMetadata1.Equals(dbMetadata2));
Console.WriteLine(dbMetadata2.Equals(dbMetadata1));

考虑以下创建 DbMetadata record类型的第三个实例的代码片段。请注意,实例 dbMetadata1 和 dbMetadata3 包含相同的值。

DbMetadata dbMetadata3 = new DbMetadata()
{DbName = "Test",DbType = "Oracle"
};

以下两条语句将在控制台窗口中显示“true”。

Console.WriteLine(dbMetadata1.Equals(dbMetadata3));
Console.WriteLine(dbMetadata3.Equals(dbMetadata1));

尽管record类型是引用类型,但 C# 9 提供了合成方法来遵循基于值的相等语义。编译器为您的record类型生成以下方法以强制实施基于值的语义:

  • Object.Equals(Object) 方法的重载

  • 接受record类型作为其参数的虚拟 Equals 方法

  • Object.GetHashCode() 方法的重载

  • 两个相等运算符的方法,即 == 运算符 和 != 运算符

  • record类型实现 System.IEquatable<T>

此外,记录类型提供了 Object.ToString() 方法的重载。这些方法是隐式生成的,您无需重新实现它们。

检查 C# 中的 Equals 方法

您可以检查是否已隐式生成了 Equals 方法。为此,请在 DbMetadata 记录中添加一个 Equals 方法,如下所示。

public record DbMetadata
{public string DbName { get; init; }public string DbType { get; init; }public override bool Equals(object obj) =>obj is DbMetadata dbMetadata && Equals(dbMetadata);
}

当您编译代码时,编译器将用以下消息标记错误:

Type 'DbMetadata' already defines a member called 'Equals' with the same parameter types

尽管record类型是一个类,但 record 关键字提供了额外的类似值类型的行为和语义,使record与类不同。record本身是一种引用类型,但它使用自己的内置相等性检查——相等性是通过值而不是引用来检查的。最后,请注意record可以是可变的,但它们主要是为不变性而设计的。

参考资料

[1]

Visual Studio 2019: https://visualstudio.microsoft.com/downloads/

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

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

相关文章

巧用TensorFlow实现图像处理

经过几年的发展&#xff0c;深度学习方法摧枯拉朽般地超越了传统方法&#xff0c;成为人工智能领域最热门的技术。谷歌、亚马逊、百度、Facebook 纷纷开源了自己的深度学习框架。而支撑AlphaGo的核心技术架构&#xff0c;TensorFlow&#xff0c;以其一鸣惊人的绝对表现&#xf…

微软面向初学者的机器学习课程:1.4-机器学习技术

写在前面&#xff1a;最近在参与microsoft/ML-For-Beginners的翻译活动&#xff0c;欢迎有兴趣的朋友加入&#xff08;https://github.com/microsoft/ML-For-Beginners/issues/71&#xff09;机器学习技术构建、使用和维护机器学习模型及其使用的数据的过程与许多其他开发工作流…

四川大学计算机科学与技术专业分数线,2015年四川大学计算机科学与技术硕士考研复试分数线是290分...

2015年四川大学计算机科学与技术硕士考研复试分数线是290分 (4页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;19.90 积分2015 年四川大学计算机科学与技术硕士考研复试分数线是 290 分2015 年四川大…

一个男人逐渐变心的过程。。 | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;渣男&#xff0c;实锤&#xff01;↓ ↓ ↓

2013-10-10

为什么80%的码农都做不了架构师&#xff1f;>>> http://wordpress.org/plugins/find-duplicates/ 检测文章的标题是否重复的插件 转载于:https://my.oschina.net/520yzw/blog/167580

arm cpu 超频_树莓派 400 超频方法介绍

对树莓派 400 进行超频非常容易实现。散热上&#xff0c;树莓派 400 设计了一个面积很大的被动散热器&#xff0c;这很有用。无需额外的主动降温就可以应对超频的散热需求。尽管有些用户通过配置&#xff0c;让树莓派 400 超频到了 2.2GHz&#xff0c;但我相信 2GHz 更稳一些。…

Blazor Server 和 WebAssembly 应用程序入门指南

翻译自 Waqas Anwar 2021年3月12日的文章 《A Beginner’s Guide To Blazor Server and WebAssembly Applications》 [1]如果您一直紧跟 .NET 世界的最新发展趋势&#xff0c;那么现在您一定听说过 Blazor。目前在 .NET 社区中有很多关于 Blazor 的宣传&#xff0c;这种宣传最常…

张萍萍山东大学计算机科学系毕业生,并行驰骋,放“码”来战!看先导杯大奖赛上山大风采...

原标题&#xff1a;并行驰骋&#xff0c;放“码”来战&#xff01;看先导杯大奖赛上山大风采近日&#xff0c;山东大学计算机科学与技术学院2018级硕士研究生杨林、2020级硕士研究生李威宇组成的团队获得中科院“先导杯”并行应用大赛人工智能赛“大规模物体检测”和“神经网络…

利用percona-toolkit工具检查MySQL数据库主从复制数据的一致性,以及修复。

利用percona-toolkit工具检查MySQL数据库主从复制数据的一致性&#xff0c;以及修复。一、pt-table-checksum检查主从库数据的一致性pt-table-checksum在MASTER上校验指定库、表&#xff0c;将结果存在一个库表里&#xff0c;复制进程将检验sql传递到slave上再执行一次。通过比…

终于丫你奶奶的浩方了!

使用NTFS权限管理清除浩方对战平台广告 作者:feixing 时间:2005-7-14 18:33:17第 1 楼相信坛子里用到浩方上网玩游戏的人应该不下少数吧&#xff1f;随着浩方越做越大。当然也就随之会多很多我们根本不想要的东西。例如在登录浩方时。下方的广告框。进入浩方时。一个劲弹出的窗…

一个妄想的技术宅, 一个自己挖的核掩体, 一起怪异的死亡事件!!

世界只有3.14 % 的人关注了青少年数学之旅2017年9月10日&#xff0c;美国马里兰Bethesda&#xff0c;一个名叫Maplewood的社区如往日般平静。一位居民正在修理自己车挡风玻璃上的裂缝&#xff0c;突然他听到有人大喊&#xff1a;快出来&#xff01;快出来&#xff01;他往声音传…

bigint在java中用什么表示_为什么说开车最能看出一个人的人品和情商?这几条说的太精辟了...

人们常说&#xff0c;想要看清一个女人&#xff0c;就和她逛一次街&#xff0c;想要认清一个男人&#xff0c;就和他喝一次酒&#xff0c;无论是男人和女人&#xff0c;想要认清一个普通人&#xff0c;通过他开车就能看出来。因为每一次开车&#xff0c;都可以看出一个人的底线…

计算机Word应用程序,Word2007目录设置_计算机软件和应用程序_IT /计算机_信息

Word2007形成目录的方法步骤/方法1.设置目录样式. 此步骤是整理论文和文章&#xff0c;然后定义和设置多级序列的样式(普通论文需要第一级序列XX字体&#xff0c;几个大小的单词等). 主要用途是word2007的样式区域. 打开word2007&#xff0c;然后在“开始”区域中找到“样式”区…

英国出土1600年前的文物,上面居然刻着简体中文?!

全世界只有3.14 % 的人关注了青少年数学之旅最近&#xff0c;一幅大约1600年前的罗马马赛克壁画在英国考古界引起了轰动。这幅壁画的长度和宽度均为6米&#xff0c;埋藏在英国西伯克郡的Boxford村。据考古专家介绍&#xff0c;算上它在内&#xff0c;类似的马赛克壁画全世界一共…

asp.net控件开发基础(20)

示例代码上面我们讨论了数据绑定控件的做法&#xff0c;但都未涉及到asp.net2.0中数据源控件的用法&#xff0c;让用惯了数据源控件的人可能感觉不适应。这次我们就开始讨论在asp.net2.0中&#xff0c;我们该如何重新定义数据绑定控件。我一直在想&#xff0c;是先讨论数据源控…

Win7 Ubuntu13.04互通(win7下用vbox安装Ubuntu)

2019独角兽企业重金招聘Python工程师标准>>> <p>VirtualBox设置</p> <p>采用的是Bridgehost方式</p> <p><a href"http://static.oschina.net/uploads/img/201310/11213732_gHMq.jpg"><img style"background-…

后端接口重定向_接口自动化面试题,建议收藏!

1、get和post的区别&#xff1f;l http是上层请求协议&#xff0c;主要定义了服务端和客户端的交互规格&#xff0c;底层都是tcp/ip协议l Get会把参数附在url之后&#xff0c;用&#xff1f;分割&#xff0c;&连接不同参数&#xff0c;Get获取资源&#xff0c;post会把参数…

期货市场计算机分析指南在线,期货市场计算机分析指南

39.60定价&#xff1a;55.00(7.2折)(美)勒博&#xff0c;(美)卢卡斯 著&#xff0c;何苗 译/2012-04-01《期货市场计算机分析指南》花费了作者大量的心血&#xff0c;这从书中的内容就可以看出。我所读过的有关技术分析的大部分书未能给各种技巧及随后的交易方法打下坚实的基础…

吃货都是怎么给自己找理由的? | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;看得我都饿了↓ ↓ ↓

用SharpZipLib来压缩和解压文件 --zt

from:http://www.cnblogs.com/zhangweiguo3984/archive/2007/03/15/314333.html#6756341.建立工程&#xff0c;添加引用&#xff0c;添加SharpZipLib.dll2.建立压缩和解压类CompressionFile.cs添加如下代码usingSystem;usingSystem.IO;usingICSharpCode.SharpZipLib.Zip;usingI…