« Record » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
Ligne 52 : Ligne 52 :
= [https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/record#value-equality Value equality] =
= [https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/record#value-equality Value equality] =
Two record objects are equal if they are of the same type and store the same values.
Two record objects are equal if they are of the same type and store the same values.
<kode lang='cs'>
public record Person(string Name, string[] PhoneNumbers);
var phoneNumbers = new string[1] { "06-10-20-30-40" };
Person person1 = new("Nicolas", phoneNumbers);
Person person2 = new("Audrey", phoneNumbers);
Console.WriteLine(person1 == person2); // True
person1.PhoneNumbers[0] = "06-11-22-33-44";
Console.WriteLine(person1 == person2); // True
</kode>

Version du 9 août 2024 à 13:48

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
public record Person(string Name, string[] PhoneNumbers);

var phoneNumbers = new string[1] { "06-10-20-30-40" };
Person person1 = new("Nicolas", phoneNumbers);
Person person2 = new("Audrey", phoneNumbers);
Console.WriteLine(person1 == person2); // True

person1.PhoneNumbers[0] = "06-11-22-33-44";
Console.WriteLine(person1 == person2); // True