Syndicat discriminé en C# : application de la sécurité des types
L'extrait de code fourni présente une tentative de création d'un syndicat discriminé en C#, semblable au concept d'union en C. Bien que cette approche fournisse un semblant de sécurité de type, elle manque de vérification de type imposée par le compilateur dans ses fonctions Is() et As(). fonctions.
Améliorations de la sécurité des types
Pour résoudre ce problème, une solution améliorée utilise une structure syndicale de sécurité des types plus rigoureuse. Cette union utilise le mécanisme de correspondance de modèles de C# pour générer des erreurs de compilation en cas d'utilisation incorrecte du type de données :
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<A, B, C> : 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<A, B, C> : Union3<A, B, C> { public readonly B Item; public Case2(B item) : base() { 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<A, B, C> : Union3<A, B, C> { public readonly C Item; public Case3(C item) : base() { this.Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) { return h(Item); } }
Utilisation
Grâce à cette union améliorée, la sécurité des types est renforcée via la correspondance de modèles . Par exemple, tenter d'utiliser le mauvais type de données dans le code suivant entraînera une erreur de compilation :
public void DoSomething() { if (ValueA.Match(a => true, b => false, c => false)) { var s = ValueA.Match(a => a.ToString(), b => null, c => null); // Safely use string type 's' } }
En implémentant une union discriminée avec correspondance de modèles, nous obtenons un degré plus élevé de sécurité de type et éliminons le temps d'exécution potentiel. erreurs associées à une gestion incorrecte du type 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!