Dot.Blog

Consulting DotNet C#, XAML, WinUI, WPF, MAUI, IA

Déconstruction, with, et C# 14 : vers une immutabilité élégante en struct

Les concepts de déconstruction et de l’opérateur with se sont longtemps cantonnés aux records. Mais C# 14 élargit la donne, notamment pour les structs immuables, leur offrant une expressivité plus fluide, plus sûre et plus lisible.

Ce court article vous explique comment tirer parti de ces évolutions dans vos propres types valeur.

🧱 Rappels : ce que l’on pouvait déjà faire

Depuis C# 9, les record permettent une déconstruction simple, ainsi que l’utilisation de l’opérateur with :

public record Point(int X, int Y);

var p1 = new Point(3, 4);
var p2 = p1 with { Y = 10 };

var (x, y) = p2;  // déconstruction

Mais jusqu’à récemment, les struct devaient être écrits manuellement pour avoir un comportement équivalent.

🌱 Nouveauté de C# 14 : with et déconstruction sur les readonly struct

C# 14 introduit une prise en charge automatique de with pour les readonly struct avec un constructeur primary.

✅ Exemple minimal :

public readonly struct Vector2(double X, double Y);

var v1 = new Vector2(1, 2);
var v2 = v1 with { Y = 5 };  // fonctionne désormais !

var (x, y) = v2;
Console.WriteLine($"{x}, {y}");  // 1, 5

⚠️ Conditions nécessaires :

Élément requis

Pourquoi

readonly struct

Garantit l’immutabilité attendue

Constructeur primary ((double X, double Y))

C# génère implicitement les propriétés en lecture seule

Pas de champs mutables

Sinon le with serait incohérent

✨ Définir votre propre Deconstruct

Si vous utilisez une struct classique, ou souhaitez un comportement spécifique à la déconstruction, vous pouvez toujours définir :

public struct Angle
{
    public double Degrees { get; }
    public double Radians => Degrees * Math.PI / 180;

    public Angle(double degrees) => Degrees = degrees;

    public void Deconstruct(out double degrees, out double radians)
    {
        degrees = Degrees;
        radians = Radians;
    }
}

Puis :

var angle = new Angle(180);
var (d, r) = angle;
Console.WriteLine($"Angle: {d}° = {r} rad");

🧪 Déconstruction et pattern matching

La déconstruction s’utilise aussi dans les patterns, rendant certaines expressions bien plus lisibles :

if (angle is (180, _)) Console.WriteLine("Demi-tour !");

// Ou avec un switch :

return angle switch
{
    (0, _) => "Nord",
    (180, _) => "Sud",
    _ => "Autre"
};

🧠 Pourquoi c’est important ?

Le support de with et de la déconstruction dans les readonly struct permet :

  • d’écrire du code immuable élégant, même en bas niveau
  • d’unifier la syntaxe entre record et struct
  • de favoriser les patterns fonctionnels dans du code performance-friendly

Cela s’inscrit dans l’évolution générale du langage vers plus de cohérence syntaxique et de sécurité.

🧵 À noter : with sur struct reste une copie par valeur

Contrairement à un record (type référence), une struct est une valeur : with crée une nouvelle instance par copie, donc sans coût d’allocation mémoire, mais avec une copie complète (shallow copy).

✅ Conclusion

C# 14 généralise des constructions modernes, comme l’opérateur with, à des types struct conçus de manière immuable, rendant le langage plus homogène et plus expressif, même dans des cas d’usage système ou orientés performance.

Ces constructions syntaxiques ne sont pas forcément toutes des nouveautés, mais elles ont évolué, et les utiliser dans son code c'est prendre le risque, pour l'instant, que bon nombre d'informaticiens ne comprennent pas votre intention ou pire la comprenne mal. Ce type de syntaxe est donc bien adapté à des développeurs travaillant seuls ou à des équipes soudées ou au moins possédant un niveau homogène et une bonne communication. Dans d'autres contextes on peut toujours se dire "ils n'ont qu'à connaître correctement le langage !", c'est pas faux, mais si je vous entends dire cela un jour, soyez convaincu que je trouverais bien dans le fatras qu'est devenu la syntaxe de C# des trucs qui vous laisseront sans voix... Alors soyons tous humbles et attachons nous à produire un code lisible par tous même s'il n'utilise pas les dernières nouveautés. Et si on désire le faire, s'assurer que cela est documenté, que l'intention est claire. Pensez aux autres c'est important en informatique, on n'est que rarement le seul à toucher à un code, le rendre incompréhensible pour certains est un acte de malveillance et non une preuve d'excellence technique...

Stay Tuned !

Faites des heureux, PARTAGEZ l'article !