Maison > développement back-end > C++ > Comment la correspondance de modèles peut-elle améliorer la sécurité des types dans les unions discriminées en C# ?

Comment la correspondance de modèles peut-elle améliorer la sécurité des types dans les unions discriminées en C# ?

DDD
Libérer: 2025-01-02 20:15:38
original
747 Les gens l'ont consulté

How Can Pattern Matching Enhance Type Safety in C# Discriminated Unions?

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);
    }
}
Copier après la connexion

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'
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal