IRONSOFTWAREHOME
MISES À JOUR POUR LES DÉVELOPPEURS

C# Union Discriminée (Comment ça fonctionne pour les développeurs)

Jacob Mellor, Directeur technique @ Team Iron
Jacob Mellor
Updated: 28 juillet 2025

Unions discriminants, également connus sous le nom d'unions étiquetées ou de types somme, représentent un outil puissant pour modéliser des données pouvant prendre différentes formes, mais avec des cas possibles bien définis et limités. Bien que C# n'ait pas d'unions discriminantes natives comme certains autres langages (par exemple, F# ou Rust), vous pouvez simuler des unions discriminantes en utilisant plusieurs techniques dans le langage. Dans ce tutoriel, nous approfondirons les unions discriminantes, comment les implémenter en C#, et leur cas d'utilisation pratique avec la bibliothèque IronPDF.

Qu'est-ce qu'une Union Discriminante ?

En termes simples, une union discriminante est un type qui peut contenir l'une de plusieurs formes ou valeurs prédéfinies. Elle fournit un moyen de créer une structure typée qui encapsule différents types ou valeurs tout en garantissant que seuls les cas valides sont traités au moment de la compilation.

Imaginez un scénario où vous souhaitez représenter le résultat d'une opération. L'opération peut soit réussir en retournant des données, soit échouer en retournant un message d'erreur. Une union discriminante vous permettrait de représenter ces deux résultats possibles en un seul type.

Example: Simulating Discriminated Union in C#

Voici un exemple de la façon dont vous pouvez simuler une union discriminante en C# en utilisant une structure de classe :

// Define an abstract base class representing the operation result.
public abstract class OperationResult<t>
{
    // Private constructor to ensure the class cannot be instantiated directly.
    private OperationResult() { }

    // Nested class representing a successful operation result.
    public sealed class Success : OperationResult<t>
    {
        public T Value { get; }
        
        public Success(T value) => Value = value;

        public override string ToString() => $"Success: {Value}";
    }

    // Nested class representing a failed operation result.
    public sealed class Failure : OperationResult<t>
    {
        public string Error { get; }
        
        public Failure(string error) => Error = error;

        public override string ToString() => $"Failure: {Error}";
    }

    // Factory method to create a successful operation result.
    public static OperationResult<t> CreateSuccess(T value) => new Success(value);

    // Factory method to create a failed operation result.
    public static OperationResult<t> CreateFailure(string error) => new Failure(error);
}
C#

Dans cet exemple, OperationResult<t> est une classe abstraite qui représente notre type d'union discriminée. Il peut s'agir soit d'un Success avec une valeur de type T soit d'un Failure avec un message d'erreur. Le constructeur privé garantit que les instances de cette classe ne peuvent être créées qu'à travers les cas prédéfinis.

Utilisation de la Correspondance de Modèles avec les Unions Discriminantes

C# fournit de puissantes capacités de correspondance de modèles qui fonctionnent bien avec les unions discriminantes. Étendons notre exemple OperationResult<t> avec une méthode qui gère différents cas à l'aide d'une expression switch.

// Method to handle the result using pattern matching.
public string HandleResult(OperationResult<int> result) =>
    result switch
    {
        OperationResult<int>.Success success => $"Operation succeeded with value: {success.Value}",
        OperationResult<int>.Failure failure => $"Operation failed with error: {failure.Error}",
        _ => throw new InvalidOperationException("Unexpected result type")
    };

L'expression switch ici gère à la fois les cas Success et Failure de l'OperationResult<int>. Cela garantit que tous les cas possibles sont couverts au moment de la compilation, offrant ainsi une sécurité de type et réduisant le risque d'erreurs à l'exécution.

Méthodes d'Extension pour les Unions Discriminantes

Vous pouvez étendre la fonctionnalité des unions discriminantes en utilisant des méthodes d'extension. Par exemple, créons une méthode d'extension pour notre OperationResult<t> afin de déterminer si le résultat est un succès :

// Static class to hold extension methods for OperationResult<t>.
public static class OperationResultExtensions
{
    // Extension method to check if the operation result indicates success. 
    public static bool IsSuccess<t>(this OperationResult<t> result) =>
        result is OperationResult<t>.Success;
}

Cette méthode statique vérifie si le résultat est une instance du cas Success.

Native Support for Discriminated Unions in C#

C# n'a pas de support natif pour les unions discriminantes comme certains autres langages, mais des discussions sont en cours dans la communauté pour ajouter une telle fonctionnalité. Les unions discriminantes natives rendraient plus facile la définition et le travail avec les types d'unions sans avoir besoin de s'appuyer sur des hiérarchies de classes.

Erreurs du Compilateur et Sécurité de Type

L'un des principaux avantages des unions discriminantes est la sécurité de type qu'elles procurent. Puisque tous les cas possibles sont connus au moment de la compilation, le compilateur peut imposer que tous les cas soient traités. Cela entraîne moins d'erreurs à l'exécution et rend le code moins sujet aux erreurs.

Par exemple, si vous oubliez de traiter un cas spécifique dans une instruction switch, le compilateur produira une erreur, vous incitant à résoudre le cas manquant. Cela est particulièrement utile lors de la gestion de structures de données complexes avec plusieurs cas possibles.

Using IronPDF with Discriminated Unions in C#

C# Union Discriminée (Comment cela fonctionne pour les développeurs) : Figure 1 - IronPDF

IronPDF est une bibliothèque PDF en C# qui aide les développeurs à créer des fichiers PDF à partir de HTML et leur permet de modifier les fichiers PDF sans aucune difficulté. Lors du travail avec des PDF en C#, vous pouvez intégrer IronPDF avec des unions discriminantes pour gérer différents scénarios lors de la génération ou du traitement des fichiers PDF. Par exemple, vous pourriez avoir un processus qui génère soit un PDF avec succès, soit qui rencontre une erreur. Les unions discriminantes vous permettent de modéliser ce processus clairement. Créons un exemple simple où nous générons un PDF à l'aide d'IronPDF et retournons le résultat sous forme d'union discriminante.

// Using directives for necessary namespaces.
using IronPdf;
using System;

// Define an abstract base class representing the PDF generation result.
public abstract class PdfResult
{
    // Private constructor to ensure the class cannot be instantiated directly.
    private PdfResult() { }

    // Nested class representing a successful PDF generation result.
    public sealed class Success : PdfResult
    {
        public PdfDocument Pdf { get; }
        
        public Success(PdfDocument pdf) => Pdf = pdf;

        public override string ToString() => "PDF generation succeeded";
    }

    // Nested class representing a failed PDF generation result.
    public sealed class Failure : PdfResult
    {
        public string ErrorMessage { get; }
        
        public Failure(string errorMessage) => ErrorMessage = errorMessage;

        public override string ToString() => $"PDF generation failed: {ErrorMessage}";
    }

    // Factory method to create a successful PDF result.
    public static PdfResult CreateSuccess(PdfDocument pdf) => new Success(pdf);

    // Factory method to create a failed PDF result.
    public static PdfResult CreateFailure(string errorMessage) => new Failure(errorMessage);
}

// Class to generate PDFs using IronPDF.
public class PdfGenerator
{
    // Method to generate a PDF from HTML content and return the result as a PdfResult.
    public PdfResult GeneratePdf(string htmlContent)
    {
        try
        {
            // Create a new ChromePdfRenderer instance.
            var renderer = new ChromePdfRenderer();

            // Attempt to render the HTML content as a PDF.
            var pdf = renderer.RenderHtmlAsPdf(htmlContent);

            // Return a success result with the generated PDF.
            return PdfResult.CreateSuccess(pdf);
        }
        catch (Exception ex)
        {
            // Return a failure result with the error message if an exception occurs.
            return PdfResult.CreateFailure(ex.Message);
        }
    }
}

La classe PdfResult représente une union discriminée avec deux cas : Success et Failure. Le cas Success contient un PdfDocument, tandis que le cas Failure contient un message d'erreur. La méthode GeneratePdf prend une chaîne HTML, tente de générer un PDF en utilisant IronPDF, et retourne le résultat en tant que PdfResult. Si la génération du PDF réussit, elle retourne le cas Success avec le PDF généré. Si une exception se produit, elle retourne le cas Failure avec le message d'erreur.

Conclusion

Les unions discriminantes en C# fournissent un moyen puissant et flexible de modéliser des données avec plusieurs cas possibles. Bien que C# ne prenne pas en charge les unions discriminantes, vous pouvez les simuler en utilisant des hiérarchies de classes, la correspondance de modèles et d'autres techniques. Le code résultant est plus typé, moins sujet aux erreurs et plus facile à maintenir.

IronPDF offre un essai gratuit pour vous aider à vous familiariser avec le logiciel sans frais initiaux. Vous pouvez explorer toutes les fonctionnalités et voir comment elles correspondent à vos besoins. Après votre essai, des licences sont disponibles à partir de $999.

Jacob Mellor, Directeur technique @ Team Iron
Directeur technique

Jacob Mellor est directeur de la technologie chez Iron Software et un ingénieur visionnaire pionnier de la technologie C# PDF. En tant que développeur à l'origine de la base de code centrale d'Iron Software, il a façonné l'architecture des produits de l'entreprise depuis sa création, la transformant aux côtés du PDG Cameron Rimington en une entreprise de plus de 50 personnes au service de la NASA, de Tesla et d'agences gouvernementales mondiales.

...
Lire la suite

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise