Record

De Banane Atomic
Aller à la navigationAller à la recherche

Links

Definition

Built-in functionality for encapsulating immutable data.
C# 10 allows the record class syntax as a synonym to clarify a reference type, and record struct to define a value type.

Primary constructor

When you declare a primary constructor on a record, the compiler generates public properties for the primary constructor parameters.

Cs.svg
public record Person(string FirstName, string LastName);

// with the generated properties it is equivalent to
public record Person
{
    public required string FirstName { get; init; }
    public required string LastName { get; init; }
};

// record struct value type with immutable properties
public readonly record struct Point(double X, double Y);
// equivalent to
public record struct Point
{
    public double X { get; init; }
    public double Y { get; init; }
}

// record struct value type with mutable properties
public record struct Point(double X, double Y);
// equivalent to
public record struct Point
{
    public double X { get; set; }
    public double Y { get; set; }
}

Immutability

Immutability means the data of the record don't change after its creation.
It is useful when you need thread-safe data-centric types or expect hash codes remaining the sames.
However, the data that a reference-type property refers to can be changed:

Cs.svg
public record Person(string Name, string[] PhoneNumbers);

Person person = new("Nicolas", new string[1] { "06-10-20-30-40" });
// the PhoneNumbers array is immutable, but the string in the array are mutable
person.PhoneNumbers[0] = "06-11-22-33-44";

Value equality

Two record objects are equal if they are of the same type and store the same values.

Cs.svg
string[] phoneNumbers = [ "06-10-20-30-40" ];
Person person1 = new("Nicolas", phoneNumbers);
Person person2 = new("Nicolas", phoneNumbers);
Console.WriteLine(person1 == person2); // true

Person person1 = new("Nicolas", [ "06-10-20-30-40" ]);
Person person2 = new("Nicolas", [ "06-10-20-30-40" ]);
Console.WriteLine(person1 == person2); // false

public record Person(string Name, string[] PhoneNumbers);

Nondestructive mutation

Allow to copy and modify the copy only.
It calls the clone method and then sets the properties that are specified in the with expression.

Cs.svg
Person person1 = new("Nicolas", [ "06-10-20-30-40" ]);
Person person2 = person1 with { Name = "Audrey" };

var person3 = person1 with { };  // copy without modification
Console.WriteLine(person1 == person3); // true