首页 > 编程语言 >C#学习 [类型系统] 记录(13)

C#学习 [类型系统] 记录(13)

时间:2024-10-29 11:02:00浏览次数:2  
标签:13 Console string 记录 C# person2 Person person1 public

要求

C#9.0.

概念

记录是一个类或结构,它为使用数据模型提供特定的语法和行为。

使用场景

  • 想要定义依赖值相等性的数据模型。

例如:想要判断两个对象实例值是否想等,这个时候用record就更加合适。

  • 想要定义对象不可变的类型。

值相等性

值相等性是指如果记录类型的两个变量类型相匹配,且所有属性和字段值都相同,那么记录类型的两个变量是相等的。

不可变性

不可变类型会阻止你在对象实例化后更改该对象的任何属性或字段值。

与类和结构的区别

声明和实例化类或结构时使用的语法与操作记录时的相同。 只是将 class 关键字替换为 record,或者使用 record struct 而不是 struct。 同样地,记录类支持相同的表示继承关系的语法。

  1. 记录与类的区别如下所示:
  • 可在主构造函数中使用位置参数来创建和实例化具有不可变属性的类型。
  • 在类中指示引用相等性或不相等的方法和运算符(例如 Object.Equals(Object) 和 ==)在记录中指示值相等性或不相等。
  • 可使用 with 表达式对不可变对象创建在所选属性中具有新值的副本。
  • 记录的 ToString 方法会创建一个格式字符串,它显示对象的类型名称及其所有公共属性的名称和值。
  • 记录可从另一个记录继承。 但记录不可从类继承,类也不可从记录继承。
  1. 记录结构与结构的不同之处是,编译器合成了方法来确定相等性和 ToString。 编译器为位置记录结构合成 Deconstruct 方法。

示例

  1. 定义一个record
public record Person(string FirstName, string LastName);

public static class Program
{
    public static void Main()
    {
        Person person = new("Nancy", "Davolio");
        Console.WriteLine(person);
        // output: Person { FirstName = Nancy, LastName = Davolio }
    }

}
  1. 值相等性
public record Person(string FirstName, string LastName, string[] PhoneNumbers);
public static class Program
{
    public static void Main()
    {
        var phoneNumbers = new string[2];
        Person person1 = new("Nancy", "Davolio", phoneNumbers);
        Person person2 = new("Nancy", "Davolio", phoneNumbers);
        // 判断值是否相等
        Console.WriteLine(person1 == person2); // output: True
        // 改变了person1.PhoneNumbers[0],person2也是引用这个,所以结果想等
        person1.PhoneNumbers[0] = "555-1234";
        Console.WriteLine(person1 == person2); // output: True
        // 判断引用是否想等,肯定不是!
        Console.WriteLine(ReferenceEquals(person1, person2)); // output: False
    }
}
  1. with表达式改变其中一个属性
public record Person(string FirstName, string LastName)
{
    public required string[] PhoneNumbers { get; init; }
}

public class Program
{
    public static void Main()
    {
        Person person1 = new("Nancy", "Davolio") { PhoneNumbers = new string[1] };
        Console.WriteLine(person1);
        // output: Person { FirstName = Nancy, LastName = Davolio, PhoneNumbers = System.String[] }

        Person person2 = person1 with { FirstName = "John" };
        Console.WriteLine(person2);
        // output: Person { FirstName = John, LastName = Davolio, PhoneNumbers = System.String[] }
        Console.WriteLine(person1 == person2); // output: False

        person2 = person1 with { PhoneNumbers = new string[1] };
        Console.WriteLine(person2);
        // output: Person { FirstName = Nancy, LastName = Davolio, PhoneNumbers = System.String[] }
        Console.WriteLine(person1 == person2); // output: False

        person2 = person1 with { };
        Console.WriteLine(person1 == person2); // output: True
    }
}

标签:13,Console,string,记录,C#,person2,Person,person1,public
From: https://www.cnblogs.com/huiy/p/18511211

相关文章

  • CodeQL学习笔记(3)-QL语法(模块、变量、表达式、公式和注解)
    最近在学习CodeQL,对于CodeQL就不介绍了,目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记,根据个人知识库笔记修改整理而来的,分享出来共同学习。个人觉得QL的语法比较反人类,至少与目前主流的这些OOP语言相比,还是有一定难度的。与现在网上的大多数所谓CodeQL教程不同,本系列基于......
  • 【论文精读】On the Relationship Between Self-Attention and Convolutional Layers
    【论文精读】OntheRelationshipBetweenSelf-AttentionandConvolutionalLayers作者:Jean-BaptisteCordonnier,AndreasLoukas,MartinJaggi发表会议:ICLR2020论文地址:arXiv:1911.03584v2目录【论文精读】OntheRelationshipBetweenSelf-AttentionandConv......
  • C# 获取utc时间,以及utc datetime 互相转化
     C#获取utc时间,以及utcdatetime互相转化 大部分源于http://blog.sina.com.cn/s/blog_4c6e822d0102dsdz.html 刚开始学习一点C#知识,研究一下UTC时间获取,如下DateTimedt=DateTime.UtcNow;另:DateTime.UtcNow.ToString()输出的是0时区的事件,DateTime.Now.ToStr......
  • C# 中的Stream流
    C#中的Stream流 流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供;流其实是一种信息的转换,是有序的,有输入和输出流(IO);1.FileStream文件流,读取和保存文件操作使用;//写入FileStreamfs=newFileStream("data.txt",FileMode.OpenOrCreate);strin......
  • SpringBoot汽车销售管理系统1cv5c 程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:销售员,客户,销售订单,品牌,车系,汽车库存,汽车入库,财务报表开题报告内容一、研究背景随着汽车市场的不断扩大和竞争的日益激烈,汽车销售管理系统的需......
  • centos9(linux): 在prometheus服务端添加被监控节点
    一,从服务端所在机器测试被监控节点是否9100端口打开1,用telnet$telnet172.16.13.191002,用nc$nc-nvv172.16.13.19100 二,在服务端prometheus中添加一个监控节点编辑配置文件:viprometheus.yml内容:在static_configs: 下增加一行:-targets:["172.16.13.......
  • Autofac 解释第一个例子 《第一篇》
    Autofac解释第一个例子《第一篇》 Autofac是一个轻量级的依赖注入的框架,同类型的框架还有Spring.NET,Unity,Castle等。Autofac的使用有一个非常让人郁闷的地方,就是服务器要求安装有Microsoft.NETFramework4KB2468871。该补丁的地址是:http://www.microsoft.com/zh-cn......
  • Performance API 实现前端资源监控
    1.PerformanceAPI的用处PerformanceAPI 是浏览器中内置的一组工具,用于测量和记录页面加载和执行过程中的各类性能指标。它的主要用处包括:监控页面资源加载:跟踪页面中的资源(如CSS、JavaScript、图片)的加载时间。分析页面加载时间:从导航到页面完全渲染的所有时间点。衡量......
  • Autofac 组件、服务、自动装配 《第二篇》
    Autofac组件、服务、自动装配《第二篇》 一、组件创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式:1、类型创建RegisterTypeAutoFac能够通过反射检查一个类型,选择一个合适的构造函数,创造这个对象的实例。......
  • 通过配置的方式Autofac 《第三篇》
    通过配置的方式Autofac《第三篇》 一、基本配置1、通过配置的方式使用Autofac<?xmlversion="1.0"?><configuration><configSections><sectionname="autofac"type="Autofac.Configuration.SectionHandler,Autofac.Configur......