• C# 10 讲解二


    介绍

    接下来我将给大家重点介绍一下.Net 6 之后的一些新的变更,文章都是来自于外国大佬的文章,我这边进行一个翻译,并加上一些自己的理解和解释。

    源作者链接:https://anthonygiretti.com/

    正文

    record struct

    首先,微软对记录类进行了改进。在C# 9 中,要声明一条记录,您将“class”关键字替换为“record”。为了避免声明时的混乱结构的记录,C#10允许新的语法声明一个类的记录混合记录和类关键字:

    public record class Product {}
    

    在C#9语法仍然有效:

    public record Product {}
    

    将结构声明为记录如下所示:

    public record struct Product {}
    

    这是一种更方便的方法,可以避免记录类和记录结构之间的混淆。记录结构是具有所有结构属性的结构,记录类是具有所有类属性的类。

    不变性

    记录结构上允许仅初始化属性:

    public record struct Product
    {
        public string Name { get; init; }
        
        public int CategoryId { get; init; }
    }
    

    如果您尝试重新分配在初始化后设置了 init 关键字的属性,您将收到编译错误:

    public class Program
    {
        public static void Main()
        {    
            var product = new Product
            {
                Name = "VideoGame",
                CategoryId = 1
            };
    
            product.Name = ""; // Error CS8852  Init-only property or indexer 'Product.Name' can only be assigned in an object initializer, or on 'this' or 'base' in an instance constructor or an 'init' accessor.
        }
    }
    
    With-expressions

    像记录类一样,记录结构允许使用with-expressions并且与记录类类似:

    using System;
    
    public class Program
    {
        public static void Main()
        {
            var product = new Product
            {
                Name = "VideoGame",
                CategoryId = 1
            };
    
            var newProduct = product with { CategoryId = 2 };
        }
    }
    
    平等比较

    因为记录结构是结构,所以比较(使用Equals方法)两个具有相同值的结构将始终返回true。struct是一种值类型,与class不同。常规结构不实现==和!=运算符,因此不可能将两个结构与这些运算符进行比较。但是,在记录结构上允许与这些运算符进行比较:

    using System;
    
    public class Program
    {
        public static void Main()
        {
            var product1 = new Product
            {
                Name = "VideoGame",
                CategoryId = 1
            };
    
            var product2 = new Product
            {
                Name = "VideoGame",
                CategoryId = 1
            };
    
            Console.WriteLine(product1.Equals(product2)); // Returns true
    
            Console.WriteLine(product1 == product2); // Returns true. Only allowed on record structs, not allowed on regular structs
        }
    }
    
    打印记录

    记录结构实现了对ToString()方法的新覆盖,该方法允许打印结构记录的结构化字符串。使用Product struct的相同签名,让我们比较输出:

    public class Program
    {
        public static void Main()
        {
            var product1 = new Product
            {
                Name = "VideoGame",
                CategoryId = 1
            };
    
            Console.WriteLine(product); // Will output: Product { Name= VideoGame, CategoryId = 1 }
        }
     }
    
    

    表现:在性能方面,结构提供了性能优势。在某些基准测试中,使用记录结构比常规结构快 20 倍。未来的帖子将展示详细的基准。

    结语

    联系作者:加群:867095512 @MrChuJiu

    公众号

  • 相关阅读:
    ssh根据姓名查询的时候报错java.lang.IndexOutOfBoundsException: Remember that
    JSF>自订转换器 小强斋
    JSF>标准验证器 小强斋
    JSF>自订验证器 小强斋
    JSF>输入、输出、命令、选择、表格、其他标签 小强斋
    JSF>自订转换器 小强斋
    JSF>自订验证器 小强斋
    JSF>错误讯息处理 小强斋
    JSF>自订验证器 小强斋
    JSF>输入、输出、命令、选择、表格、其他标签 小强斋
  • 原文地址:https://www.cnblogs.com/MrChuJiu/p/15841194.html
Copyright © 2020-2023  润新知