Types record : notions de base et syntaxe
Déclarez des classes record et des structures record, comprenez la syntaxe positionnelle et comparez les records aux classes.
Types record : notions de base et syntaxe est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.
Que sont les types d’enregistrement
Les enregistrements (introduits avec C# 9) sont des types référence conçus pour des données immuables avec une sémantique de valeur. Ils génèrent automatiquement une égalité fondée sur les valeurs des propriétés, un ToString() lisible et prennent en charge la mutation non destructive au moyen d’expressions with.
Syntaxe positionnelle des enregistrements
La syntaxe positionnelle est la forme la plus concise. Les propriétés, le constructeur, la déconstruction et l’égalité sont tous générés à partir d’une seule ligne.
// All in one line:
public record Point(double X, double Y);
public record Person(string FirstName, string LastName, int Age);
// Generated automatically:
// - Primary constructor: new Point(1.0, 2.0)
// - Deconstruct: var (x, y) = point;
// - Equality: p1 == p2 compares X and Y values
// - ToString: "Point { X = 1, Y = 2 }"Enregistrements et classes
Les enregistrements et les classes diffèrent principalement par leur égalité par défaut et leur intention. Les enregistrements utilisent une égalité structurelle (les valeurs), tandis que les classes utilisent une égalité par référence (l’identité).
var p1 = new Point(1, 2);
var p2 = new Point(1, 2);
var p3 = p1;
// Record: structural equality
Console.WriteLine(p1 == p2); // True — same values
Console.WriteLine(p1 == p3); // True — same values
// Compare with a class:
var c1 = new PointClass(1, 2);
var c2 = new PointClass(1, 2);
Console.WriteLine(c1 == c2); // False — different referencesStructures d’enregistrement
C# 10 ajoute record struct : des enregistrements de type valeur. Ils offrent les mêmes fonctionnalités d’égalité et de ToString que les classes d’enregistrement, mais sont alloués sur la pile comme les structures.
// Record struct: value type, stack-allocated
public record struct Color(byte R, byte G, byte B);
var red = new Color(255, 0, 0);
var red2 = new Color(255, 0, 0);
Console.WriteLine(red == red2); // True — value equality
// Readonly record struct: fully immutable
public readonly record struct Coord(double Lat, double Lng);Déclaration standard d’un enregistrement avec un corps
Les enregistrements peuvent avoir un corps complet : vous pouvez y ajouter des propriétés calculées, des méthodes et une validation dans le constructeur tout en conservant l’égalité et le ToString automatiques.
public record Person(string FirstName, string LastName)
{
// Computed property
public string FullName => $"{FirstName} {LastName}";
// Validation in constructor
public Person : this(FirstName, LastName)
{
if (string.IsNullOrWhiteSpace(FirstName))
throw new ArgumentException("FirstName required");
}
// Method
public Person WithUpperCase() =>
this with { FirstName = FirstName.ToUpper(), LastName = LastName.ToUpper() };
}Héritage avec les enregistrements
Les enregistrements prennent en charge l’héritage. Un enregistrement dérivé ajoute des propriétés et participe aux mêmes règles d’égalité : deux enregistrements sont égaux uniquement si leurs types et toutes leurs valeurs correspondent.
public record Shape(string Color);
public record Circle(string Color, double Radius) : Shape(Color);
public record Rectangle(string Color, double Width, double Height) : Shape(Color);
var c1 = new Circle("red", 5.0);
var c2 = new Circle("red", 5.0);
var r1 = new Rectangle("red", 5.0, 3.0);
Console.WriteLine(c1 == c2); // True
Console.WriteLine(c1 == r1); // False — different typesPropriétés d’enregistrement non positionnelles
Les enregistrements ne se limitent pas aux paramètres positionnels. Vous pouvez combiner des propriétés positionnelles et manuelles, et utiliser des initialiseurs de propriétés pour définir des valeurs par défaut.
public record Order
{
public int Id { get; init; }
public string CustomerName { get; init; } = "";
public List<OrderLine> Lines { get; init; } = new();
public DateTime CreatedAt { get; init; } = DateTime.UtcNow;
public OrderStatus Status { get; init; } = OrderStatus.Pending;
}
// Initialization:
var order = new Order
{
Id = 42,
CustomerName = "Alice"
// Other props use defaults
};Déconstruction
Les enregistrements positionnels génèrent automatiquement une méthode Deconstruct, ce qui permet de les déstructurer dans des affectations et lors de la mise en correspondance de motifs.
public record Point(double X, double Y);
var p = new Point(3.0, 4.0);
// Deconstruction
var (x, y) = p;
Console.WriteLine($"x={x}, y={y}");
// In switch:
string Describe(Point pt) => pt switch
{
(0, 0) => "Origin",
(double x, 0) => $"On X-axis at {x}",
(0, double y) => $"On Y-axis at {y}",
var (px, py) => $"Point ({px}, {py})"
};Les enregistrements comme DTO
Les enregistrements conviennent parfaitement aux DTO de requête et de réponse d’API. Ils sont immuables et sérialisables, et leur égalité générée automatiquement simplifie les tests.
// API request/response records
public record CreateProductRequest(
string Name,
decimal Price,
int Stock);
public record ProductResponse(
int Id,
string Name,
decimal Price,
int Stock,
DateTime CreatedAt);
// In controller:
app.MapPost("/products", (CreateProductRequest req, ProductService svc) =>
{
var product = svc.Create(req.Name, req.Price, req.Stock);
return Results.Created($"/products/{product.Id}",
new ProductResponse(product.Id, product.Name,
product.Price, product.Stock,
product.CreatedAt));
});Égalité des enregistrements dans les tests unitaires
L’égalité par valeur rend les enregistrements idéaux pour les assertions de tests unitaires. Vous pouvez comparer les enregistrements attendu et obtenu avec == ou Assert.Equal, sans comparateur personnalisé.
[Fact]
public async Task CreateOrder_ReturnsCorrectResponse()
{
var response = await _client.PostAsJsonAsync("/orders",
new CreateOrderRequest(CustomerId: 1, ProductId: 5, Quantity: 2));
var order = await response.Content.ReadFromJsonAsync<OrderResponse>();
// Simple equality check — no custom IEqualityComparer needed!
Assert.Equal(
new OrderResponse(Id: order!.Id, Status: "Pending", Total: 99.98m),
order);
}Vérification rapide
Quelle sémantique d’égalité les enregistrements C# utilisent-ils par défaut ?
Récapitulatif : notions fondamentales des types d’enregistrement
À retenir :
- Les enregistrements sont des types référence avec une égalité par valeur (structurelle) par défaut
- La syntaxe positionnelle génère le constructeur, la déconstruction, l’égalité et ToString
record struct(C# 10) est une variante de type valeur- Les enregistrements prennent en charge l’héritage : le type doit également correspondre pour que l’égalité soit établie
- Ils conviennent parfaitement aux DTO, aux contrats d’API et aux assertions de tests unitaires
- Ajoutez des propriétés calculées et des méthodes dans un bloc de corps, en complément des paramètres positionnels
Questions Fréquemment Posées
La leçon « Types record : notions de base et syntaxe » est-elle gratuite ?
Oui — le texte complet de « Types record : notions de base et syntaxe » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Types record : notions de base et syntaxe » ?
Déclarez des classes record et des structures record, comprenez la syntaxe positionnelle et comparez les records aux classes. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Types record : notions de base et syntaxe » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Types record : notions de base et syntaxe
- Immuabilité avec init et with
- Égalité des valeurs et déconstruction
- Records dans la conception pilotée par le domaine