Maison > développement back-end > C++ > Comment pouvons-nous parvenir à des syndicats discriminés de type sûr en C# ?

Comment pouvons-nous parvenir à des syndicats discriminés de type sûr en C# ?

Mary-Kate Olsen
Libérer: 2025-01-02 14:20:43
original
360 Les gens l'ont consulté

How Can We Achieve Type-Safe Discriminated Unions in C#?

Syndicats discriminés en C

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

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

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal