當前位置: 妍妍網 > 碼農

掌握 C# 中的記錄:深入了解 C# 9 的不可變性功能

2024-07-09碼農

介紹

隨著 C# 9 的釋出,Microsoft 引入了記錄,這是一種新的參照型別,可顯著簡化不可變數據物件的建立。記錄特別適用於不可變性和值相等性至關重要的方案,例如數據傳輸物件 (DTO)、配置物件等。

在這篇文章中,我們將探討 C# 9 中記錄的詳細資訊、如何有效地使用它們,以及它們可以大大增強程式碼的一些高級方案。

什麽是Records?

C# 9 中的記錄提供了一種簡潔的方法來定義具有內建值相等性的不可變數據物件。與傳統類不同,記錄被設計為預設不可變,這意味著它們的狀態在建立後無法修改。

基本記錄聲明

下面是 C# 9 中記錄的簡單範例:

publicrecordPerson(string FirstName, string LastName);

在此範例中,是具有兩個內容的記錄:和 。編譯器會自動為此記錄生成多個成員,包括:PersonFirstNameLastName

  • 接受 和 的建構函式。FirstNameLastName

  • 和 的唯讀內容。FirstNameLastName

  • 位置模式匹配的解構方法。

  • 基於值的相等方法 (, )。EqualsGetHashCode

  • Immutability and With-Expressions

    記錄的關鍵特征之一是不可變性。建立記錄後,無法修改其內容。但是,您可以使用 with-expressions 建立更改某些內容的新記錄:

    var person = newPerson("John", "Doe");
    var updatedPerson = person with { LastName = "Smith" };
    Console.WriteLine(person); // Output: Person { FirstName = John, LastName = Doe }
    Console.WriteLine(updatedPerson); // Output: Person { FirstName = John, LastName = Smith }

    該關鍵字建立記錄的新例項,復制現有值並套用指定的更改。with

    Value Equality

    記錄提供內建值相等,這意味著具有相同數據的兩條記錄被視為相等:

    var person1 = newPerson("John", "Doe");
    var person2 = newPerson("John", "Doe");
    Console.WriteLine(person1 == person2); // Output: True
    Console.WriteLine(person1.Equals(person2)); // Output: True

    此行為與類形成鮮明對比,在類中,預設情況下,相等性基於物件參照。

    Advanced Scenarios

    位置記錄

    位置記錄允許您使用位置參數定義記錄,使程式碼更加簡潔:

    publicrecordPoint(int X, int Y);
    var point = newPoint(1, 2);
    var (x, y) = point; // Deconstruction
    Console.WriteLine($"X: {x}, Y: {y}"); // Output: X: 1, Y: 2

    自訂記錄

    雖然記錄提供了許多內建功能,但您可以透過添加其他方法或覆蓋現有方法來自訂它們:

    publicrecordPerson(string FirstName, string LastName)
    {
    publicstring FullName => $"{FirstName}{LastName}";
    publicoverridestringToString() => $"Person: {FullName}";
    }
    var person = newPerson("John", "Doe");
    Console.WriteLine(person); // Output: Person: John Doe

    記錄和繼承

    記錄支持繼承,允許您建立不可變型別的階層:

    publicrecordPerson(string FirstName, string LastName);
    publicrecordEmployee(string FirstName, string LastName, string Position) : Person(FirstName, LastName);
    var employee = newEmployee("John", "Doe", "Developer");
    Console.WriteLine(employee); // Output: Employee { FirstName = John, LastName = Doe, Position = Developer }

    非位置記錄

    您還可以定義非位置記錄,從而更好地控制內容初始化:

    publicrecordCar
    {
    publicstring Make { get; init; }
    publicstring Model { get; init; }
    publicCar(string make, string model)
    {
    Make = make;
    Model = model;
    }
    }
    var car = newCar("Toyota", "Corolla");
    Console.WriteLine(car); // Output: Car { Make = Toyota, Model = Corolla }

    記錄中的可變性

    雖然預設情況下記錄是不可變的,但如有必要,您可以定義可變記錄。但是,通常不鼓勵這樣做,因為它違背了記錄的主要設計原則:

    publicrecordMutablePerson
    {
    publicstring FirstName { get; set; }
    publicstring LastName { get; set; }
    }

    實際套用

    記錄在不可變性和值相等很重要的方案中特別有用。以下是一些實際套用:

    數據傳輸物件 (DTO)
    記錄是 DTO 的理想選擇,DTO 通常需要不可變性和值相等:

    publicrecordCustomerDto(int Id, string Name, string Email);

    配置物件
    記錄提供了一種方便的方法來定義配置物件,這些物件在初始化後不應更改:

    publicrecordAppConfig(string ConnectionString, int MaxRetries);

    活動溯源
    在事件源系統中,記錄可用於表示不可變事件:

    publicrecordOrderPlaced(Guid OrderId, DateTime PlacedAt, decimal Amount);

    結論

    C# 9 中的記錄引入了一種強大而簡潔的方法來定義具有內建值相等性的不可變數據物件。透過利用記錄,您可以建立更可靠和可維護的程式碼,尤其是在不可變性和值平等至關重要的情況下。

    無論您使用的是 DTO、配置物件還是事件源系統,記錄都提供了一種在 C# 中定義數據結構的現代高效方法。采用此功能可增強您的 C# 編程技能並構建更可靠的應用程式。

    如果你喜歡我的文章,請給我一個贊!謝謝