Les record struct
Introduction
Apparus avec la version 10 du langage C#, ils combinent les avantages des records et des structures. En tant que structure, un record struct est un type valeur. En tant que record, il bénéficie automatiquement de nombreuses fonctionnalités générées par le compilateur, notamment l'égalité par valeur, l'opérateur with, ainsi qu'une implémentation de ToString().
Les record struct sont particulièrement adaptés pour représenter des valeurs, considérées comme immuables, tout en limitant les allocations mémoire.
Quand utiliser un record struct ?
Le type record struct est particulièrement adapté lorsque :
-
Les données représentent une valeur
-
Les objets sont de petite taille
-
Les comparaisons doivent s'effectuer par valeur
-
Les allocations mémoire doivent être limitées
-
Les données sont idéalement immuables
Implémentation
Un record struct se déclare simplement en combinant les mots-clés record et struct :
Cette syntaxe utilise un constructeur primaire. Il est aussi possible d'utiliser une déclaration plus classique, comme celle utilisée dans les précédents articles :
public record struct Point
{
public int X { get; init; }
public int Y { get; init; }
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Le comportement d'un type valeur
Comme une structure, un record struct est un type valeur.
Les données sont copiées des propriétés de point1 pour créer point2. Ainsi, l'instruction :
n'a aucun impact sur la variable point1. Les deux variables sont totalement indépendantes.
Une égalité par valeur
Contrairement à une structure classique, le compilateur génère automatiquement l'égalité par valeur.
La variable result vaut true, car les deux objets possèdent les mêmes valeurs. Aucune surcharge de Equals(), ni de l'opérateur == n'est nécessaire.
L'opérateur with
Comme un record, un record struct bénéficie de l'opérateur with :
point2 est une copie de point1, dans laquelle seules les propriétés précisées dans l'expression with sont modifiées.
Les record struct en lecture seule
Comme les structures, les record struct peuvent être déclarés en lecture seule avec le mot clé readonly :
De même que pour les structures, il est recommandé de déclarer un record struct en lecture seule, afin de garantir son immutabilité.
Choisir entre record ou record struct
Il n'est pas toujours évident de choisir le bon type entre record et record struct. Pour vous aider, je vous recommande de choisir un record lorsque :
-
Vous souhaitez implémenter un type référence
-
Plusieurs variables doivent pouvoir référencer le même objet
-
Les copies d'objets seront peu fréquentes
Et un record struct lorsque :
-
L'objet représente une valeur
-
Les copies d'objets sont peu coûteuses
-
Vous souhaitez limiter les allocations sur le tas (heap)