HOWTO · Csharp
Équivalent de typedef en C#
Découvrez l’équivalent de typedef en C# avec les alias using, avec les alias de tuples de C# 12 et les alias ordinaires de types génériques.
Sur cette page
C# ne possède pas le mot-clé typedef. L’équivalent le plus proche est un alias using, qui donne à un espace de noms ou à un type existant un nom local au fichier.
Un alias améliore la lisibilité, mais ne crée pas un nouveau type à l’exécution. Utilisez une classe, un record ou une structure lorsqu’un type distinct doit fournir un comportement ou une validation.
Utiliser un alias using pour un type existant
Placez l’alias avec les autres directives using en haut du fichier et utilisez une cible entièrement qualifiée. L’alias ne dépend ainsi d’aucune autre directive.
Par exemple, using RouteTable = System.Collections.Generic.Dictionary<string, System.Collections.Generic.List<int>>; nomme un type générique construit existant.
RouteTable est seulement une écriture courte de Dictionary<string, List<int>>. L’alias n’ajoute pas de sécurité de type et ne crée pas une nouvelle déclaration. Un alias normal est valable dans le fichier source, pas automatiquement dans tout le projet.
Les formes de using ont des rôles différents : using System.Text; importe un espace de noms, using static System.Math; importe des membres statiques et using RouteTable = ...; crée un alias.
Alias de tuples de C# 12 et alias de types génériques
C# 12 a étendu les alias using aux types auparavant sans nom comme les tuples. Les alias ordinaires de types nommés et de types génériques construits étaient déjà pris en charge. L’exemple suivant utilise les deux formes :
using RouteTable = System.Collections.Generic.Dictionary<string, System.Collections.Generic.List<int>>;
using Coordinate = (double Latitude, double Longitude);
RouteTable routes = new() { ["home"] = [1, 2] };
Coordinate point = (52.37, 4.90);
System.Console.WriteLine($"{routes["home"].Count}:{point.Latitude:F2}");
2:52.37
Ce cas réussi a été restauré et compilé dans un environnement .NET 10.0.401 isolé et sans réseau. Le projet a été copié dans le stockage temporaire du conteneur, restauré avec --ignore-failed-sources, puis exécuté sans modifier le fixture ni l’image.
Avec C# 11 ou une version antérieure, ne supposez pas que les alias de formes arbitraires compilent. Mettez à jour l’outil ou écrivez le type complet. Les alias de types nommés sont plus anciens que C# 12.
Ce qu’un alias ne fait pas
Un alias n’est pas un type distinct comparable à un typedef. RouteTable et le type Dictionary complet sont interchangeables à la compilation. Si une valeur ne doit pas être confondue avec une autre, utilisez un vrai type de domaine, comme un record ou une structure.
De même, un alias de tuple donne seulement un nom lisible à une forme de tuple ; il n’en fait pas une classe nommée. Les noms d’éléments facilitent l’accès et la documentation, sans fournir d’identité de type indépendante.
Les cibles de référence nullable sont une limite
La grammaire étendue conserve des restrictions. Un type de référence nullable au niveau supérieur ne peut pas être la cible d’un alias. using MaybeName = string?; est donc volontairement invalide.
Le compilateur rejette cette déclaration car string? est une annotation de référence nullable et non une cible autorisée dans cette position. Le fixture de limite doit échouer à la compilation ; il fournit un diagnostic et n’est pas une solution exécutable.
Quand définir un vrai type
Choisissez une classe, un record ou une structure lorsque le nom doit représenter un concept distinct. C’est nécessaire pour les invariants, la validation, les méthodes, la construction contrôlée, l’égalité ou une API publique. Préférez un alias pour une écriture plus courte et locale au fichier.
Consultez la documentation Microsoft sur la directive using, C# 12 et la proposition des alias using.
FAQ
- C# prend-il en charge
typedef? Non. Utilisez un aliasusingou un vrai type. - Un alias peut-il nommer un tuple ? Oui, depuis C# 12.
- L’alias est-il disponible dans chaque fichier ? Non, un alias normal reste limité à son fichier.
- Crée-t-il un nouveau type ? Non, il désigne le type existant.
- Pourquoi
using MaybeName = string?;échoue-t-il ? Une référence nullable de niveau supérieur est interdite comme cible.