16.记录类型、改进模式匹配、改进模式组合和部分方法

  1. 16.CSharp各版本新功能和语法-CSharp9功能和语法
    1. 16.1 知识点
      1. Records (记录类型)
      2. 改进的模式匹配
      3. 改进的模式组合
      4. 允许部分方法实现

16.CSharp各版本新功能和语法-CSharp9功能和语法


16.1 知识点

Records (记录类型)

Records 提供了一种简化数据传输和模式匹配的方式。它们是不可变的引用类型,编译器会自动生成一些常见方法,如 EqualsGetHashCodeToString。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。然后,我们分别实现了 FileLoggerConsoleLogger 类来记录日志。

  • FileLogger 类中,我们提供了部分方法 LogHeader 的具体实现,在 Log 方法中调用了这个部分方法,以输出日志的头部信息和尾部信息。
  • 而在 ConsoleLogger 类中,我们没有提供部分方法 LogHeader 的具体实现,因此在 Log 方法中并没有调用这个部分方法。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏