Union discriminée en C# : une approche tolérante aux pannes
Dans la programmation orientée objet, une union discriminée représente un conteneur qui peut en contenir un d'un ensemble connu de types. En C#, cela peut être réalisé grâce à une technique appelée « Contraintes de type génériques ».
Considérez le problème de la représentation de plusieurs types de données au sein d'une seule structure de données. Par exemple, nous pouvons souhaiter créer une classe « ValueWrapper » comportant deux champs : « ValueA » et « ValueB », chacun pouvant contenir une valeur de type string, int ou Foo.
En C# , l'utilisation d'une approche traditionnelle basée sur les objets donnerait une classe qui ressemblerait à ceci :
public class ValueWrapper { public DateTime ValueCreationDate; // ... other meta data about the value public object ValueA; public object ValueB; }
Cependant, cette approche présente des inconvénients. Traiter des valeurs en tant qu'objets peut introduire des problèmes de sécurité de type. Pour surmonter ces défis, nous pouvons tirer parti d'une union discriminée.
En C#, une union discriminée peut être implémentée à l'aide de contraintes de type génériques. En limitant les paramètres de type générique à un ensemble spécifié de types, nous pouvons garantir la sécurité des types au moment de la compilation.
Une façon d'y parvenir consiste à créer une classe qui encapsule les informations de type et fournit des méthodes pour accéder à la valeur. . Par exemple :
public class Union<A, B, C> { private readonly Type type; public readonly A a; public readonly B b; public readonly C c; public Union(A a) { type = typeof(A); this.a = a; } // ... similar constructors for B and C ... public bool Is<T>() where T : A or T : B or T : C { return typeof(T) == type; } }
En utilisant cette union discriminée, nous pouvons réécrire la classe "ValueWrapper" comme suit :
public class ValueWrapper { public DateTime ValueCreationDate; public Union<int, string, Foo> ValueA; public Union<double, Bar, Foo> ValueB; }
Cette approche garantit la sécurité des types en restreignant les valeurs qui peuvent être stocké dans "ValueA" et "ValueB" pour les types spécifiés. De plus, il élimine le besoin de casting et de déballage, offrant ainsi un moyen plus efficace et plus fiable de travailler avec différents types de données.
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!