Les alias de type C# 12
Publié le 22/04/2024
Par  Christophe MOMMER

C# 12, sorti avec .NET 8, permet de rendre les types primitifs plus explicite.

Si vous n'aimez pas lire, il y a une vidéo ici sur ce sujet : https://youtube.com/shorts/DkNWe7E03jg

Très souvent, on a recours à des types primitifs (int, string, ValueTuple, etc.) pour stocker des éléments qui, pourtant, peuvent avoir un véritable sens métier. Même si la préconisation est d'éviter la "primitive obsession" (c'est-à-dire éviter les types primitifs pour des données métier afin d'y ajouter du sens et des vérifications, comme j'en parle dans mon cours sur la clean architecture), il y a des cas où ça peut être utile de faire un alias d'un type primitif pour l'utiliser comme un type à part entière et rendre le code explicite.

Comparons :

public User GetUserById(int userId)
{
...
}

Soyons franc : sur le code ci-dessus, le paramètre bien nommé nous donne déjà une bonne indication. Mais ce ne serait pas mieux d'avoir ceci ?

using UserId = int;

public User GetUserById(UserId userId)
{
...
}

Le code reste globalement le même, on a juste ajouté une instruction using au début du code pour rendre ce type explicite.

Attention cependant : aucune vérification supplémentaire ne sera effectuée, il s'agit d'un alias de confort. Ainsi, le code suivante ne provoquera aucune erreur :

using UserId = int;
using CourseId = int;

public void Methode()
{
   CourseId c = 1;
   var user = GetUserById(c); // pas d'erreur ici !
}

public User GetUserById(UserId userId)
{
..
}

D'où la recommandation principale : éviter la primitive obsession pour éviter ce genre d'inversion