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