Union discriminante en C#
Question :
Comment créer une union discriminante en C# (également appelé union étiquetée) ? Cette union permet d'utiliser différents types pour représenter une valeur unique et assure la sécurité des types au moment de la compilation.
Réponse :
En utilisant des contraintes de paramètres de type génériques, vous pouvez créer des unions discernantes de type sécurisé. Le code suivant montre comment créer une union discriminante avec trois cas (int, char et string) :
public abstract class Union3<A, B, C> { public abstract T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h); private Union3() { } public sealed class Case1 : Union3<A, B, C> { public readonly A Item; public Case1(A item) : base() { this.Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) { return f(Item); } } public sealed class Case2 : Union3<A, B, C> { public readonly B Item; public Case2(B item) { this.Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) { return g(Item); } } public sealed class Case3 : Union3<A, B, C> { public readonly C Item; public Case3(C item) { this.Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) { return h(Item); } } }
Pour créer une instance de l'union discriminante, utilisez une méthode de fabrique statique pour spécifier le cas correspondant et apporter de la valeur. Par exemple :
Union3<int, char, string> union1 = Union3<int, char, string>.Case1(5); Union3<int, char, string> union2 = Union3<int, char, string>.Case2('x'); Union3<int, char, string> union3 = Union3<int, char, string>.Case3("Juliet");
En utilisant la méthode Match, vous pouvez accéder en toute sécurité à la valeur de l'union dans un cas précis. Par exemple :
string value1 = union1.Match(num => num.ToString(), character => new string(new char[] { character }), word => word); string value2 = union2.Match(num => num.ToString(), character => new string(new char[] { character }), word => word); string value3 = union3.Match(num => num.ToString(), character => new string(new char[] { character }), word => word);
Cette méthode utilise la vérification de type au moment de la compilation pour garantir que la fonction correcte est fournie pour le cas donné. Le compilateur générera une erreur si vous essayez d'accéder à une valeur qui ne correspond pas à la casse.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!