C# continue d'évoluer, et l'une des fonctionnalités les plus intéressantes qui pourrait être introduite est celle des discriminated unions. Ce concept est déjà bien connu des développeurs dans d'autres langages comme TypeScript et apporte davantage de sûreté de typage et de flexibilité dans le code. Mais que sont exactement les discriminated unions, et comment pourraient-elles être implémentées en C# ?
Que sont les discriminated unions ?
Les discriminated unions sont une forme d'union type dans laquelle une propriété commune est utilisée pour distinguer différents types à l'intérieur d'une union. Un exemple simple pourrait un jour ressembler à ceci en C# :
// Union Class
union Shape
{
Circle(int radius);
Rectangle(int width, int height);
}
// Usage
Shape shape = new Circle(10);
Les discriminated unions améliorent fortement la sûreté de typage en imposant que tous les cas possibles d'une variable soient couverts, par exemple dans une instruction switch.
Cela évite les erreurs d'exécution inattendues et encourage un code plus propre et plus sûr.
// Pattern Matching
var area = shape switch
{
Circle c => Math.PI * c.Radius * c.Radius,
Rectangle r => r.Width * r.Height,
};
Quels sont les avantages des discriminated unions ?
Sûreté de typage : les discriminated unions rendent le code plus robuste en obligeant les développeurs à traiter chaque cas de type possible.
Gestion efficace de plusieurs types : au lieu d'utiliser de nombreuses classes de base ou interfaces, elles permettent de définir différents types dans une même structure.
Code plus lisible : au lieu d'utiliser des castings incertains ou des vérifications de type dispersées, il est immédiatement clair quels types sont autorisés.
Comment pourraient-elles être implémentées en C# ?
C# envisage plusieurs formes de discriminated unions. La proposition TypeUnions décrit cinq variantes :
Union Classes
Elles sont destinées à des hiérarchies de types plus complexes, dans lesquelles plusieurs classes partagent un discriminateur commun tout en ayant des propriétés différentes.
Union Structs
Une idée proche des Union Classes, mais avec des structures. L'avantage ici est une meilleure gestion mémoire, puisque les structures sont stockées sur la pile et non sur le tas.
// Union Structs
union struct Shape
{
Circle(int radius);
Rectangle(int width, int height);
}
Ad Hoc Unions
Elles permettent de regrouper dynamiquement des types dans une union sans devoir les définir explicitement à l'avance. C'est utile lorsque les types doivent être déterminés à l'exécution.
// Ad Hoc Unions
record Circle(int radius);
record Rectangle(int width, int height);
(Circle or Rectangle) shape = new Circle(10);
Custom Unions
Les développeurs peuvent créer leurs propres types d'union spécialisés, adaptés à des besoins particuliers.
// Custom Unions
[Union]
public struct Shape
{
public record Circle(int radius);
public record Rectangle(int width, int height);
public bool TryGetCircle(out Circle? circle) { ... }
public bool TryGetRectangle(out Rectangle? rectangle) { ... }
}
Common Unions
Ces unions pourraient être fournies dans la bibliothèque standard de C# afin de prendre en charge des modèles fréquents, comme les types Option ou Result.
// Common Unions
public union struct Option<T>
{
Some(T value);
None = default;
}
public union struct Result<T, TError>
{
Success(T value);
Error(TError error);
}
Conclusion
L'introduction des discriminated unions en C# pourrait changer en profondeur la manière de gérer les types. Cette fonctionnalité offrirait aux développeurs davantage de contrôle et de sécurité lorsqu'ils manipulent différents types de données, tout en rendant le code plus lisible et plus facile à maintenir. Il reste à voir si, et quand, cette fonctionnalité tant attendue trouvera sa place dans l'écosystème C#.
La fonctionnalité est encore en discussion et peut évoluer avant une implémentation finale. Vous pouvez participer à la discussion et donner votre avis ici : Type Unions for C# Proposal
Besoin d'aide ?
Vous souhaitez utiliser des fonctionnalités C# modernes comme les discriminated unions ou d'autres mécanismes de typage avancés dans vos projets, mais vous hésitez sur la meilleure approche ? Nous pouvons vous aider. Contactez-nous via notre page de contact et voyons ensemble comment moderniser votre développement .NET.




