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

公众号

posted @ 2022-01-24 22:31  初久的私房菜  阅读(186)  评论(0编辑  收藏  举报
作者:初久的私房菜
好好学习,天天向上
返回顶部小火箭
好友榜:
如果愿意,把你的博客地址放这里
张弛:https://blog.zhangchi.fun/