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

C#关键字record介绍

在C#9中,新增关键字record,作为模型类,使用起来更方便,后续版本又增加了record struct关键字,作为补充。

本质上,只使用record时,实际上是一个继承接口IEquatable<T>的类,使用record struct时,是一个继承IEquatable<T>的结构。

当我们编写以下的类时

using System.Text;namespace RecordSample
{public record Book{public Book(string name, int pages){Name = name;Pages = pages;}public string Name { get; private set; }public int Pages { get; init; }}public record struct Note{public string Name { get; init; }public int Pages { get; init; }}
}

关键字是record,那么实际上,编译器识别的是什么的,我们使用dnspy反编译工具可以看到book是一个class,对应反编译代码:

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;namespace RecordSample
{[NullableContext(1)][Nullable(0)]public class Book : IEquatable<Book>{[CompilerGenerated]protected virtual Type EqualityContract{[CompilerGenerated]get{return typeof(Book);}}public Book(string name, int pages){this.Name = name;this.Pages = pages;}public string Name { get; private set; }public int Pages { get; set; }[CompilerGenerated]public override string ToString(){StringBuilder stringBuilder = new StringBuilder();stringBuilder.Append("Book");stringBuilder.Append(" { ");if (this.PrintMembers(stringBuilder)){stringBuilder.Append(' ');}stringBuilder.Append('}');return stringBuilder.ToString();}[CompilerGenerated]protected virtual bool PrintMembers(StringBuilder builder){RuntimeHelpers.EnsureSufficientExecutionStack();builder.Append("Name = ");builder.Append(this.Name);builder.Append(", Pages = ");builder.Append(this.Pages.ToString());return true;}[NullableContext(2)][CompilerGenerated]public static bool operator !=(Book left, Book right){return !(left == right);}[NullableContext(2)][CompilerGenerated]public static bool operator ==(Book left, Book right){return left == right || (left != null && left.Equals(right));}[CompilerGenerated]public override int GetHashCode(){return (EqualityComparer<Type>.Default.GetHashCode(this.EqualityContract) * -1521134295 + EqualityComparer<string>.Default.GetHashCode(this.<Name>k__BackingField)) * -1521134295 + EqualityComparer<int>.Default.GetHashCode(this.<Pages>k__BackingField);}[NullableContext(2)][CompilerGenerated]public override bool Equals(object obj){return this.Equals(obj as Book);}[NullableContext(2)][CompilerGenerated]public virtual bool Equals(Book other){return this == other || (other != null && this.EqualityContract == other.EqualityContract && EqualityComparer<string>.Default.Equals(this.<Name>k__BackingField, other.<Name>k__BackingField) && EqualityComparer<int>.Default.Equals(this.<Pages>k__BackingField, other.<Pages>k__BackingField));}[CompilerGenerated]protected Book(Book original){this.Name = original.<Name>k__BackingField;this.Pages = original.<Pages>k__BackingField;}}
}

可以看到,编译器帮我们自动实现了运算符重载,包括==,!=,以及ToString操作,如果各个属性值都相等,那么认为两个对象相等。

相对的,record struct是一个结构,也是类似效果

下面演示对应对象效果

using RecordSample;

Book book1 = new Book("C# in Depth", 900);
Book book2 = new Book("C# in Depth", 900);
Console.WriteLine(book1 == book2); // True
Console.WriteLine(book1); // Book { Name = C# in Depth, Pages = 900 }
var book3 = book1 with { Pages = 1000 };
Console.WriteLine(book1 == book3); // False

Note n1= new Note { Name = "Note1", Pages = 10 };
Note n2= new Note { Name = "Note1", Pages = 10 };
Console.WriteLine(n1 == n2); // True
Console.WriteLine(n1); // Note { Name = Note1, Pages = 10 }
var n3 = n1 with { Pages = 20 };
Console.WriteLine(n1 == n3); // False


文章转载自:

http://QyIDUcIJ.zfyfy.cn
http://iLhJcNfw.zfyfy.cn
http://tftVsxEn.zfyfy.cn
http://JI8FUp4C.zfyfy.cn
http://d0ipPC1u.zfyfy.cn
http://KFNaW0CD.zfyfy.cn
http://tFWXEujH.zfyfy.cn
http://x6jciLmm.zfyfy.cn
http://y6XETMKZ.zfyfy.cn
http://xbjpunKh.zfyfy.cn
http://FKmEZzSk.zfyfy.cn
http://aQuh5cDK.zfyfy.cn
http://6XDs99Y8.zfyfy.cn
http://9WJZPl0n.zfyfy.cn
http://abgpZBMa.zfyfy.cn
http://UllPaUPU.zfyfy.cn
http://ArJPL0k8.zfyfy.cn
http://7POnGsvG.zfyfy.cn
http://C661UO1e.zfyfy.cn
http://WAkbjHVS.zfyfy.cn
http://9caR7MRs.zfyfy.cn
http://FflXDSe5.zfyfy.cn
http://CirVVzpK.zfyfy.cn
http://to4LAMcr.zfyfy.cn
http://6PaDW7DP.zfyfy.cn
http://8Ejg7lX0.zfyfy.cn
http://Ug2Oblev.zfyfy.cn
http://E7VLZBjV.zfyfy.cn
http://g41rwMRW.zfyfy.cn
http://hGvLAtVS.zfyfy.cn
http://www.dtcms.com/a/388528.html

相关文章:

  • 试验台铁地板的设计与应用
  • 原子操作:多线程编程
  • 项目:寻虫记日志系统(三)
  • 在Arduino上模拟和电子I/O工作
  • Windows 命令行:相对路径
  • 线程、进程、协程
  • Java/注解Annotation/反射/元数据
  • C++学习:哈希表的底层思路及其实现
  • 机器学习python库-Gradio
  • 创作一个简单的编程语言,首先生成custom_arc_lexer.g4文件
  • 湖北燃气瓶装送气工证考哪些科目?
  • MySQL死锁回滚导致数据丢失,如何用备份完美恢复?
  • Zustand入门及使用教程(二--更新状态)
  • Matplotlib统计图:绘制精美的直方图、条形图与箱线图
  • 在el-table-column上过滤数据,进行格式化处理
  • 记一次golang结合前端的axios、uniapp进行预签名分片上传遇到403签名错误踩坑
  • 十一章 无界面压测
  • 多色印刷机的高精度同步控制:EtherCAT与EtherNet/IP的集成应用
  • 【随笔】【蓝屏】DMA错误
  • Coze源码分析-资源库-创建工作流-后端源码-IDL/API/应用/领域层
  • 5 分钟将网站打包成 APP:高效实现方案
  • 物联网智能网关核心功能实现:解析西门子1500 PLC的MQTT通信配置全流程
  • 新国标电动自行车实施,BMS 静电浪涌风险与对策
  • 【Python】Python文件操作
  • C#如何使用ApiPost接口,将数据显示在unity面板
  • 零基础从头教学Linux(Day 36)
  • 深度学习(2)
  • 火山 17 声音回调
  • Flash芯片的VCC上电到可操作时间过长
  • CSP-S——各算法可以实现的问题