×

Sử dụng Pattern Matching và Records trong C# 10+

Trong các phiên bản mới nhất của C#, ngôn ngữ này tiếp tục phát triển để mang lại cho các nhà phát triển những công cụ mạnh mẽ và linh hoạt. Hai trong số những tính năng nổi bật trong C# 10 trở về sau là Pattern Matching và Records. Cả hai đều mang đến những cải tiến đáng kể về mặt cấu trúc và khả năng diễn đạt mã nguồn, giúp việc viết mã trở nên trực quan và duy trì hơn.

Pattern Matching trong C#

Pattern Matching là một kỹ thuật đóng vai trò quan trọng trong việc kiểm tra và xử lý dữ liệu trong C#. Nó cho phép kiểm tra dữ liệu theo các mô hình cụ thể thay vì chỉ dựa trên các loại dữ liệu đơn giản. Điều này giúp mã nguồn trở nên ngắn gọn và đọc dễ dàng hơn.

Các dạng Pattern Matching phổ biến

  1. Type Pattern: Kiểm tra xem một đối tượng có phải là một loại cụ thể không và chuyển đổi nó về loại đó.

    if (obj is string str) 
    {
        Console.WriteLine($"String length: {str.Length}");
    }
    
  2. Constant Pattern: Kiểm tra xem một đối tượng có bằng với một giá trị hằng số cụ thể không.

    if (x is 42) 
    {
        Console.WriteLine("The answer to everything.");
    }
    
  3. Relational Pattern: Sử dụng các toán tử so sánh để kiểm tra điều kiện.

    if (number is > 0) 
    {
        Console.WriteLine("The number is positive.");
    }
    
  4. Logical Pattern: Kết hợp các pattern bằng các toán tử logic (and, or, not).

    if (obj is int i and >= 0) 
    {
        Console.WriteLine($"Non-negative integer: {i}");
    }
    
  5. List Pattern: Kiểm tra các phần tử trong danh sách hoặc mảng.

    if (array is [0, 1, 2, ..]) 
    {
        Console.WriteLine("Starts with 0, 1, 2.");
    }
    

Records trong C#

Records là một tính năng mới đầy sức mạnh trong C# có mặt từ phiên bản C# 9 và tiếp tục được cải tiến trong C# 10. Records cho phép các nhà phát triển định nghĩa các loại dữ liệu bất biến một cách dễ dàng và rõ ràng.

Định nghĩa và Sử dụng Records

Records thường được sử dụng khi bạn muốn tạo các lớp có mục đích chính là lưu trữ dữ liệu.

public record Person(string FirstName, string LastName);

var person1 = new Person("John", "Doe");
var person2 = new Person("John", "Doe");

// So sánh về mặt nội dung
Console.WriteLine(person1 == person2); // True

Điều đặc biệt ở đây là records cung cấp một phương thức kiểm tra bằng nhau dựa trên giá trị (value equality) thay vì tham chiếu (reference equality), giúp việc so sánh và bảo toàn dữ liệu tốt hơn.

Records với các Tính năng Bổ sung

  • With-expressions: Tạo ra một bản sao của record với một vài thay đổi.

    var person3 = person1 with { FirstName = "Jane" };
    
  • Deconstruction: Giải nén các thuộc tính của record vào các biến.

    var (firstName, lastName) = person1;
    Console.WriteLine($"{firstName} {lastName}"); // John Doe
    

Tích hợp hai tính năng trong cùng một mã nguồn

Kết hợp Pattern Matching và Records giúp tăng cường sự linh hoạt và hiệu quả khi xử lý dữ liệu phức tạp:

public record Vehicle(string Make, string Model);

void PrintVehicleInfo(object obj)
{
    if (obj is Vehicle { Make: "Toyota", Model: var model })
    {
        Console.WriteLine($"Toyota model: {model}");
    }
}

var car = new Vehicle("Toyota", "Corolla");
PrintVehicleInfo(car); // Output: Toyota model: Corolla

Như vậy, ta thấy rằng việc sử dụng Pattern Matching và Records trong C# 10+ không chỉ làm cho code ngắn gọn và dễ đọc, mà còn giúp tăng tính mô-đun và dễ bảo trì của phần mềm. Những tính năng này là minh chứng rõ ràng cho sự tiến hóa không ngừng của ngôn ngữ C# nhằm đáp ứng các nhu cầu phức tạp của lập trình hiện đại.

Comments