Introduction :
Les syndicats discriminés, également appelés syndicats étiquetés ou syndicats disjoints, sont un construction de programmation qui permet le stockage de différents types de données dans une seule variable. Ils fournissent un moyen sécurisé de représenter un ensemble de valeurs avec un nombre limité de variantes.
Comprendre le problème :
La question propose une classe Union en C# pour fournir des fonctionnalités similaires à l'union de style C. Cependant, la classe ne dispose pas d'une vérification de type imposée par le compilateur lors de l'utilisation des fonctions Is et As. Le problème survient lorsque l'on tente de récupérer une valeur d'un type spécifique sans s'assurer que l'union contient réellement ce type.
Pouvons-nous parvenir à une union sécurisée de type en C# ?
Oui, nous pouvons implémenter des unions discriminées de type sécurisé en C# en utilisant des contraintes génériques et une correspondance de modèles. Voici un exemple :
public abstract class Union<A, B, C> { public abstract T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h); } public class Case1<A, B, C> : Union<A, B, C> { public readonly A Item; public Case1(A item) { Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => f(Item); } public class Case2<A, B, C> : Union<A, B, C> { public readonly B Item; public Case2(B item) { Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => g(Item); } public class Case3<A, B, C> : Union<A, B, C> { public readonly C Item; public Case3(C item) { Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => h(Item); }
Utilisation :
Pour utiliser ce type d'Union, créez des instances de cas spécifiques :
var union1 = new Case1<int, string, bool>(5); var union2 = new Case2<int, string, bool>('a'); var union3 = new Case3<int, string, bool>(true);
Correspondance de modèle :
Pour récupérer la valeur de l'union, utilisez le modèle matching :
var value1 = union1.Match(n => n, _ => null, _ => null); // Returns 5 (int) var value2 = union2.Match(_ => null, c => c.ToString(), _ => null); // Returns "a" (string) var value3 = union3.Match(_ => null, _ => null, b => b.ToString()); // Returns "True" (string)
Conclusion :
Cette solution fournit des unions discriminées de type sécurisé en C# en tirant parti des génériques et de la correspondance de modèles. Il garantit que le code ne tente pas d'accéder à des valeurs incorrectes, améliorant ainsi la sécurité et l'exactitude de l'application.
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!