Record
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.
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:
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.
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.
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 |