record是C#9引入的新的引用类型,详细见官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-9#record-types

在C#中,引用类型有:interface,class,delegate,数组;现在record加入了进来,这是一个与类极度相似,但又不同的类型,重点在比较两个对象相等时,不是用引用地址作比较(虽然它是个引用类型),而是用“类型名{属性名1=属性值,属性名2=属性值,……}”(注1:这是一种形象但不严格的说法)。

DDD中,有实体和值对象的概念,其中值对象定义如下:

通过对象属性值来识别的对象,它将多个相关属性组合为一个概念整体——《实现领域驱动设计》

就是通过这个对象的各个属性相同不相同来判断是不是同一个值对象,这时,record就最合适不过了,它能直接判断两个实例化后的对象是否相等,。

record本质上个class,对反射,dapper的适配,面向对象的特征都是相同的,demo见:https://github.com/axzxs2001/Asp.NetCoreExperiment/blob/master/Asp.NetCoreExperiment/CSharp/RecordTypeDemo/Program.cs

using Dapper;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;namespace RecordTypeDemo
{class Program{static void Main(string[] args){//接口类型IShow show = new Entity1() { ID = 1, Name = "桂素伟" };Console.WriteLine(show);//输出结果:Entity1 { ID = 1, Name = 桂素伟 }//抽象类型Entity entity = new Entity1() { ID = 1, Name = "桂素伟" };Console.WriteLine(entity);//输出结果:Entity1 { ID = 1, Name = 桂素伟 }//注1:虽然 类型名{属性名1=属性值,属性名2=属性值,……} 相等,但比较结果是不等的Console.WriteLine($"show == entity结果:{show == entity}");//输出结果:show == entity结果::False//实体类型var entity1 = new Entity1() { ID = 1, Name = "桂素伟" };Console.WriteLine(entity1);//输出结果:Entity1 { ID = 1, Name = 桂素伟 }Console.WriteLine($"(entity1 == entity结果:{entity1 == entity}");//输出结果:(entity1 == entity结果:TrueConsole.WriteLine($"(entity1 == entity结果:{entity1.Equals(entity)}");//输出结果:(entity1 == entity结果:TrueAddEntity(entity);ReflectionTest(entity1);}/// <summary>/// 反射中使用record,和类相山/// </summary>/// <param name="entity"></param>static void ReflectionTest(Entity entity){var type = Assembly.GetExecutingAssembly().GetType("RecordTypeDemo.Entity");Console.WriteLine(type.IsClass);}/// <summary>/// 对dapper适配/// </summary>/// <param name="entity"></param>/// <returns></returns>static bool AddEntity(Entity entity){using (var con = new NpgsqlConnection("Server=127.0.0.1;Port=5432;UserId=postgres;Password=postgres2018;Database=postgres;")){var list = con.Query<Entity1>("select * from entitys").ToList();if (!list.Contains(entity)){con.Execute("insert into entitys(id,name) values(@id,@name)", entity);}return true;}/*表结构
CREATE TABLE public.entitys
(id integer NOT NULL DEFAULT nextval('entitys_id_seq'::regclass),name character varying(256) COLLATE pg_catalog."default",CONSTRAINT entitys_pkey PRIMARY KEY (id)
)
*/}}#region 面向对象特征和类一样/// <summary>/// 接口/// </summary>public interface IShow{void Show();}/// <summary>/// 抽象记录/// </summary>public abstract record Entity : IShow{public abstract int ID { get; set; }public abstract string Name { get; set; }public void Show(){Console.WriteLine($"{this.GetType().Name}:");Console.WriteLine($"{this.ToString()}");}}/// <summary>/// 记录/// </summary>public record Entity1 : Entity{public override int ID{get;set;}public override string Name{get;set;}}#endregion
}

C#9引入的自定义类型record相关推荐

  1. oracle 自定义表类型赋值,Oracle自定义类型 Record + PL/SQL表

    一,什么是记录Record和PL/SQL表? 记录Record:由单行多列的标量类型构成的临时记录对象类型.类似于多维数组. PL/SQL表:由多行单列的索引列和可用列构成的临时索引表对象类型.类似于 ...

  2. 三层中如何在服务器与客户端之间传输自定义的'Record'类型数据的例子

    博主自写的三层中如何在服务器与客户端之间传输自定义的'Record'类型数据的例子. 效果图如下: 例子源码下载:http://Delphi盒子上还未审核.现在已审核!下载地址为:http://sd. ...

  3. java自定义方法参数注解_Java方法中的参数太多,第1部分:自定义类型

    java自定义方法参数注解 我认为构造函数和方法中冗长的参数列表是Java开发中的另一个" 危险信号 ",就逻辑和功能而言,它们不一定是"错误的",但通常暗示当 ...

  4. Java方法中的参数太多,第1部分:自定义类型

    我认为构造函数和方法中冗长的参数列表是Java开发中的另一个" 危险信号 ",就逻辑和功能而言,它们不一定是"错误的",但通常暗示当前或将来出现错误的可能性很高 ...

  5. Oracle自定义类型

    Oracle自定义类型可以通过type/create type来声明或者创建 一,四种创建方式 1.1,使用create type创建object类型 create or replace type o ...

  6. C语言——自定义类型(结构体,枚举,联合体,位段)

    目录 结构体 结构体的定义 匿名结构体 结构体的自引用 结构体大小计算 位段 枚举 枚举概念 枚举的声明与使用 枚举大小计算 枚举与宏的区别 联合体 联合体的概念 联合体的声明与使用 联合体大小计算 ...

  7. Oracle 自定义类型TYPE(subtype, type object, type body, type table) 用法

    原 ORACLE 自定义类型 type/ object 2017年03月28日 13:58:23 tan1012194073 阅读数:5999 版权声明:本文为博主原创文章,未经博主允许不得转载. h ...

  8. oracle自定义的记录类型,oracle 自定义类型 type / create type

    一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...

  9. Spring MVC自定义类型转换器Converter、参数解析器HandlerMethodArgumentResolver

    文章目录 一.前言 二.类型转换器Converter 1.自定义类型转换器 三.参数解析器 1.自定义分页参数解析器 2.自定义注解参数解析器 一.前言 Spring MVC源码分析相关文章已出: S ...

最新文章

  1. Microbiome:芝麻菜中肠杆菌科主导核心微生物组并贡献抗生素抗性组(简单套路16S+meta+培养组发高分文章)
  2. FTP错误 [ftp: connect: No route to host] 解决方法
  3. 东 北 大 学计算机辅助设计,东北大学计算机辅助设计(B)
  4. 微信小程序开发(二)
  5. Android播放器自定义,android surfaceView+mediaPlayer 自定义视频播放器
  6. 20175333曹雅坤 实验二 Java面向对象程序设计
  7. SSH免密直接登录方法
  8. 添加tomcat7插件设置jdk编译版本
  9. atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc...
  10. 机器学习面试之偏差方差
  11. 每日一测5(关于继承)
  12. 关于Android中获取Intent里的数据
  13. 程序员需要鼓励师吗?我觉得写代码的时候更需要这个!
  14. [Deep Learning] 神经网络基础
  15. java不能对什么类型进行转换_@Value - 无法将类型'java.lang.String'的值转换为所需类型'java.lang.Integer'...
  16. SpringBoot2.4.2+Vue集成Activiti6流程引擎
  17. 微信公众号授权H5页面
  18. python_csv文件写入
  19. 谷歌、华盛顿大学联合研究:为什么在标准数据集上刷榜有问题
  20. 简单好用的js 压缩工具

热门文章

  1. Spark技术内幕: Task向Executor提交的源代码解析
  2. Zabbix3.0 安装Graphtree
  3. Java Servlet API中文说明文档
  4. 在主窗体中打开一个新子窗体,如果已有子窗体,则激活它,而不打开新的。...
  5. 使用ama0实现串口通信_“ AMA”是什么意思,以及如何使用它?
  6. 在c语言中load,一道题理清Objective-C中的load和initialize
  7. pandas DataFrame 数据处理常用操作
  8. PrincetonAlgorithm I - Assignment2 Deques and Randomized Queues
  9. Windows用户安全小技巧
  10. XCode5 真机调试及发布应用