16.CSharp各版本新功能和语法-CSharp9功能和语法
16.1 知识点
Records (记录类型)
Records 提供了一种简化数据传输和模式匹配的方式。它们是不可变的引用类型,编译器会自动生成一些常见方法,如 Equals
、GetHashCode
和 ToString
。Records 可以通过with
表达式创建新的实例,而不改变原始实例。
// 定义一个记录类型 Person,包含名字和姓氏
public record Person(string FirstName, string LastName);
// 创建一个名为 person1 的 Person 实例
var person1 = new Person("John", "Doe");
// 使用 with 表达式创建一个新的 Person 实例 person2,并修改 LastName
var person2 = person1 with { LastName = "Smith" };
改进的模式匹配
C# 9 改进了模式匹配的功能,包括对记录类型的模式匹配支持,以及新的逻辑模式和常量模式。
// 逻辑模式:检查 shape 是否为 Circle 类型,且半径大于 0
if (shape is Circle { Radius: > 0 } circle)
{
Console.WriteLine($"Circle with radius {circle.Radius}");
}
// 常量模式:根据 expression 的值进行不同的处理
switch (expression)
{
case 0:
Console.WriteLine("It's zero");
break;
case int n when n > 0:
Console.WriteLine("It's a positive number");
break;
}
改进的模式组合
C# 9 中引入了新的模式组合功能,包括 and、or 和 not 运算符,使得编写复杂的模式匹配变得更加简单。
// 使用模式组合:检查 shape 是否为 Circle 类型,且半径大于 0,且不为 null
if (shape is Circle { Radius: > 0 } circle and not null)
{
Console.WriteLine($"Circle with radius {circle.Radius}");
}
允许部分方法实现
C# 9 引入了部分方法的概念,允许方法的声明和实现分离。这使得在接口中定义一些方法,而不强制实现所有方法成为可能。
using System;
// 定义一个日志记录器接口
public interface ILogger
{
// 部分方法:用于记录日志的头部信息
partial void LogHeader();
// 普通方法:用于记录日志的具体内容
void Log(string message);
}
// 实现 ILogger 接口的文件日志记录器类
public class FileLogger : ILogger
{
// 实现部分方法 LogHeader
public partial void LogHeader()
{
Console.WriteLine("=== Log Start ===");
}
// 实现普通方法 Log
public void Log(string message)
{
// 调用部分方法 LogHeader
LogHeader();
// 输出日志信息
Console.WriteLine($"[File Log]: {message}");
// 输出日志结束标识
Console.WriteLine("=== Log End ===");
}
}
// 实现 ILogger 接口的控制台日志记录器类
public class ConsoleLogger : ILogger
{
// 部分方法在这里并没有提供实现,因此没有 LogHeader 方法的具体代码
// 实现普通方法 Log
public void Log(string message)
{
// 输出日志信息
Console.WriteLine($"[Console Log]: {message}");
}
}
class Program
{
static void Main(string[] args)
{
// 创建 FileLogger 实例并记录日志
var fileLogger = new FileLogger();
fileLogger.Log("This is a file log message.");
Console.WriteLine(); // 添加空行以分隔两次日志记录
// 创建 ConsoleLogger 实例并记录日志
var consoleLogger = new ConsoleLogger();
consoleLogger.Log("This is a console log message.");
}
}
在上面的例子中,我们定义了一个 ILogger
接口,其中包含了一个部分方法 LogHeader
和一个普通方法 Log
。然后,我们分别实现了 FileLogger
和 ConsoleLogger
类来记录日志。
- 在
FileLogger
类中,我们提供了部分方法LogHeader
的具体实现,在Log
方法中调用了这个部分方法,以输出日志的头部信息和尾部信息。 - 而在
ConsoleLogger
类中,我们没有提供部分方法LogHeader
的具体实现,因此在Log
方法中并没有调用这个部分方法。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com