Record Types et Objets Immuables en C#
Apprenez les record types et les objets immuables en C#, avec l’égalité par valeur, les with-expressions et des exemples.
Introduits avec C# 9, les types record facilitent la création d’objets immutables (non modifiables). Les records, comme les classes, peuvent contenir à la fois des données et du comportement ; cependant, leur objectif principal est de définir des objets de données (modèles de données, DTO, etc.) de manière plus simple, plus sûre et plus lisible. Les objets immuables sont ceux dont les valeurs ne peuvent pas être modifiées après leur création. Cette approche améliore la sécurité dans les scénarios multi-thread et réduit les risques d’erreurs.
Qu’est-ce qu’un Record ?
Le mot-clé record est utilisé pour définir des types de données similaires aux classes ou aux structs.
Par défaut, les records fournissent une égalité basée sur les valeurs (value-based equality).
Cela signifie que si les champs de deux objets record sont identiques, les objets sont considérés comme égaux.
public record Person(string Name, int Age);
class Program
{
static void Main()
{
var p1 = new Person("Jean", 30);
var p2 = new Person("Jean", 30);
Console.WriteLine(p1 == p2); // True (comparaison basée sur les valeurs)
}
}
Propriétés Immuables
Dans les types record, les propriétés peuvent être définies avec l’accesseur init par défaut.
Cela permet d’attribuer des valeurs lors de la création de l’objet, mais empêche toute modification ultérieure.
public record Product
{
public string Name { get; init; } = string.Empty;
public decimal Price { get; init; }
}
class Program
{
static void Main()
{
var p = new Product { Name = "Stylo", Price = 12.5m };
Console.WriteLine($"{p.Name} - {p.Price} EUR");
// p.Price = 15m; // Erreur de compilation ! (propriété init-only)
}
}
L’expression with
Avec les types record, l’expression with peut être utilisée pour créer une copie d’un objet existant
en ne modifiant que les champs souhaités. C’est très utile lors du travail avec des objets immuables.
var p1 = new Product { Name = "Cahier", Price = 45m };
// Créer une copie avec l’expression with et modifier le prix
var p2 = p1 with { Price = 40m };
Console.WriteLine(p1.Price); // 45
Console.WriteLine(p2.Price); // 40
Record Class vs. Record Struct
Avec C# 10, le support de record struct a été ajouté.
Cela signifie qu’un record peut être défini non seulement comme un type basé sur une classe, mais aussi comme un type valeur.
record class est un type référence, tandis que record struct est un type valeur.
public record struct Point(int X, int Y);
class Program
{
static void Main()
{
var a = new Point(1, 2);
var b = new Point(1, 2);
Console.WriteLine(a == b); // True (égalité basée sur les valeurs)
}
}
Avantages des Objets Immuables
- Sûrs pour les threads : Les objets sont sûrs en environnement multi-thread puisqu’ils ne peuvent pas changer.
- Aucun effet de bord : Adaptés à la programmation fonctionnelle ; la même entrée produit toujours la même sortie.
- Débogage plus facile : Comme l’état de l’objet ne change pas, le débogage est simplifié.
- Lisibilité du code : Les modèles de données sont définis de manière plus claire et concise.
Exemple : Modèle de Données Immutable
Dans l’exemple ci-dessous, l’objet Order est défini comme immuable et
de nouvelles versions sont créées grâce à l’expression with.
public record Order(int Id, string Customer, decimal Amount);
class Program
{
static void Main()
{
var o1 = new Order(1, "Jean", 500m);
Console.WriteLine(o1);
// Créer une copie avec l’expression with
var o2 = o1 with { Amount = 600m };
Console.WriteLine(o2);
}
}
// Sortie :
Order { Id = 1, Customer = Jean, Amount = 500 }
Order { Id = 1, Customer = Jean, Amount = 600 }
TL;DR
record: Nouveau type offrant une égalité basée sur les valeurs.- Propriétés
init: Assignées lors de la création de l’objet, non modifiables ensuite. - Expression
with: Sert à dériver des copies d’objets immuables. record class= type référence,record struct= type valeur.- Les objets immuables sont thread-safe, fiables et offrent un modèle lisible.
Articles connexes
Classes, Objets, Propriétés et Méthodes en C#
Découvrez comment les classes, objets, propriétés et méthodes en C# constituent les fondements de la programmation orientée objet.
Encapsulation, Héritage et Polymorphisme en C#
Apprenez l’encapsulation, l’héritage et le polymorphisme en C# avec des exemples pour maîtriser les bases de la POO.