Chargement...

Records

Les Records en C# constituent une évolution majeure introduite à partir de C# 9 pour simplifier la gestion des données immuables (Immutable Data). Contrairement aux classes traditionnelles, les Records offrent par défaut une égalité basée sur les valeurs (Value Equality) et non sur les références mémoire, ce qui les rend particulièrement adaptés pour représenter des objets de type “data carriers” tels que DTOs (Data Transfer Objects), modèles d’entités métiers ou encore structures de configuration. Leur importance réside dans la capacité à réduire le code répétitif, améliorer la lisibilité, et renforcer la fiabilité en évitant des erreurs liées à la mutabilité des données.
Les Records sont utiles lorsqu’il s’agit de manipuler des structures de données complexes dans lesquelles l’immuabilité et la comparaison par valeur sont essentielles. Ils s’intègrent naturellement dans les principes de la POO (Programmation Orientée Objet), tout en facilitant l’application de concepts algorithmiques comme la comparaison, la recherche et le filtrage au sein de collections. Dans un contexte d’architecture logicielle, ils permettent de séparer les responsabilités, de renforcer l’encapsulation et de contribuer à des architectures propres (Clean Architecture).
Dans ce tutoriel, le lecteur découvrira la syntaxe des Records, leur usage avec les structures de données, ainsi que des cas pratiques de leur application dans des projets réels. L’objectif est de maîtriser les bonnes pratiques autour des Records et de comprendre comment les exploiter efficacement dans le développement avancé en C#.

Exemple de Base

text
TEXT Code
using System;

public record Person(string Name, int Age);

public class Program
{
public static void Main()
{
Person p1 = new("Alice", 28);
Person p2 = new("Alice", 28);
Person p3 = new("Bob", 30);

Console.WriteLine($"p1 == p2: {p1 == p2}");
Console.WriteLine($"p1 == p3: {p1 == p3}");

// Création d'une nouvelle instance avec modification partielle
Person updated = p1 with { Age = 29 };
Console.WriteLine($"Updated Person: {updated.Name}, {updated.Age}");
}

}

Dans l’exemple ci-dessus, nous avons défini un Record appelé Person qui contient deux propriétés, Name et Age. La déclaration record Person(string Name, int Age) est un raccourci de syntaxe qui génère automatiquement un constructeur, des propriétés immuables (init), une méthode ToString, ainsi que des implémentations de Equals et GetHashCode basées sur les valeurs des propriétés.
La comparaison entre p1 et p2 retourne true, bien que ce soient deux objets distincts en mémoire, car leurs valeurs sont identiques. Cela démontre la sémantique d’égalité par valeur des Records, contrairement aux classes où l’égalité est par référence par défaut. La comparaison entre p1 et p3 retourne false, car les valeurs diffèrent.
L’utilisation de l’expression with permet de cloner un Record en modifiant seulement certaines propriétés, ici l’Age. Cela illustre l’immuabilité : au lieu de modifier p1 directement, on crée une nouvelle instance updated avec les changements souhaités.
Dans des projets réels, cette approche est très utile pour représenter des entités métiers ou des modèles de transfert de données, où la cohérence et l’intégrité des données doivent être garanties. Les Records apportent une solution idiomatique pour travailler efficacement avec les structures de données et réduire le code répétitif, tout en respectant les bonnes pratiques C#.

Exemple Pratique

text
TEXT Code
using System;
using System.Collections.Generic;
using System.Linq;

public record Product(int Id, string Name, decimal Price);

public record Order(int OrderId, List<Product> Products)
{
public decimal CalculateTotal() => Products.Sum(p => p.Price);

public Order AddProduct(Product product)
{
// Retourne une nouvelle commande immuable avec le produit ajouté
var newProducts = new List<Product>(Products) { product };
return this with { Products = newProducts };
}

}

public class Program
{
public static void Main()
{
var laptop = new Product(1, "Laptop", 1500m);
var mouse = new Product(2, "Mouse", 40m);

var order = new Order(101, new List<Product> { laptop });
Console.WriteLine($"Total initial: {order.CalculateTotal()}");

var updatedOrder = order.AddProduct(mouse);
Console.WriteLine($"Total après ajout: {updatedOrder.CalculateTotal()}");

// Comparaison par valeur
var duplicate = new Product(1, "Laptop", 1500m);
Console.WriteLine($"Laptop == duplicate: {laptop == duplicate}");
}

}

C# best practices and common pitfalls:
Lorsqu’on utilise les Records, certaines bonnes pratiques doivent être respectées. Premièrement, privilégiez les Records pour les objets immuables où seule la donnée compte, tels que DTOs, entités métiers simples, ou modèles pour l’échange d’informations entre couches applicatives. Assurez-vous d’utiliser les propriétés init afin de garantir l’immuabilité.
Un piège courant est de considérer les Records comme des remplaçants universels des classes. En réalité, si vous avez besoin de mutabilité ou de logique métier complexe avec héritage, une classe classique reste plus appropriée. Une autre erreur fréquente est de mal comprendre la comparaison par valeur : toutes les propriétés publiques définissent l’égalité, ce qui peut être problématique si certaines propriétés ne doivent pas entrer dans cette logique.
Côté performance, évitez de créer trop de copies dans des boucles intensives, car l’usage excessif du mot-clé with peut générer une surcharge mémoire inutile. En termes de sécurité, soyez attentifs à la méthode ToString générée automatiquement qui affiche toutes les propriétés ; redéfinissez-la si vos Records contiennent des données sensibles.
Pour le débogage, utilisez des points d’arrêt sur les expressions with afin de tracer la création des nouvelles instances. Enfin, appliquez les principes de Clean Code en nommant clairement vos Records et leurs propriétés pour maintenir une architecture cohérente et facile à maintenir.

📊 Tableau de Référence

C# Element/Concept Description Usage Example
record keyword Définit un type Record immuable avec égalité par valeur public record Person(string Name, int Age);
with expression Crée une copie immuable avec modifications partielles var newPerson = oldPerson with { Age = 30 };
Value Equality Implémentation automatique de Equals et == par valeur Console.WriteLine(p1 == p2);
Positional Parameters Déclaration concise des propriétés dans le constructeur public record Product(int Id, string Name);
init accessor Définit les propriétés immuables assignables uniquement à l’initialisation public int Id { get; init; }

En résumé, les Records en C# constituent un outil puissant pour modéliser des données immuables de manière concise, sûre et efficace. Ils offrent des avantages tels que la comparaison par valeur, la génération automatique de méthodes essentielles, et la possibilité de créer des copies partielles avec le mot-clé with. L’usage des Records favorise la lisibilité du code, réduit les risques d’erreurs et s’intègre parfaitement dans une architecture logicielle moderne.
Cette notion s’inscrit dans un cadre plus large de développement en C#, en lien avec des concepts comme LINQ, les DTOs et les ViewModels dans des applications web ou desktop, ainsi que les principes de l’architecture propre. Les prochaines étapes recommandées pour approfondir incluent l’étude du Pattern Matching avancé avec Records, la gestion de l’héritage entre Records, et les comparaisons de performance entre Records, classes et structures.
Pour appliquer concrètement les Records, commencez par les utiliser dans vos projets pour la gestion des entités métiers ou des transferts de données entre services. Explorez également les ressources officielles de Microsoft et des ouvrages avancés comme “C# in Depth” afin d’élargir vos connaissances. Cette maîtrise vous aidera à concevoir des solutions robustes, élégantes et maintenables dans vos projets C#.

🧠 Testez Vos Connaissances

Prêt à Commencer

Test Your Knowledge

Test your understanding of this topic with practical questions.

4
Questions
🎯
70%
Pour Réussir
♾️
Temps
🔄
Tentatives

📝 Instructions

  • Lisez chaque question attentivement
  • Sélectionnez la meilleure réponse pour chaque question
  • Vous pouvez refaire le quiz autant de fois que vous le souhaitez
  • Votre progression sera affichée en haut