Chargement...

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


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