OneOf pour C# (.NET) : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

OneOf pour C# (.NET) : guide complet avec exemples

La bibliothèque OneOf est une implémentation d'unions discriminées (discriminated unions) pour le langage C#. Elle résout un problème fondamental : comment représenter élégamment, dans un langage à typage statique, une valeur qui peut être de plusieurs types prédéfinis. Au lieu d'utiliser object avec des casts, Nullable ou de créer des hiérarchies de classes, OneOf offre une manière type-safe et expressive de travailler avec de telles valeurs.

Pourquoi en avez-vous besoin ? Premièrement, cela améliore la lisibilité du code : la signature d'une méthode retournant OneOf<Success, Error> indique immédiatement que l'opération peut réussir ou échouer. Deuxièmement, cela élimine toute une classe d'erreurs liées aux casts incorrects. Troisièmement, OneOf oblige le développeur à traiter tous les cas possibles, rendant le code plus robuste et prévisible. C'est particulièrement utile dans les scénarios où l'on utilise traditionnellement des exceptions (pour le flux de contrôle) ou le retour de null.

OneOf s'intègre parfaitement dans le style de programmation fonctionnelle en C#. Il permet de modéliser plus précisément le domaine métier : au lieu d'avoir une classe Result avec des drapeaux et des objets imbriqués, vous pouvez utiliser OneOf<T0, T1, T2>, où chaque type représente un état possible. Cela rend le code plus déclaratif et réduit le nombre de constructions if-else.

Installation

L'installation de la bibliothèque se fait via le gestionnaire de packages NuGet. Exécutez l'une des commandes suivantes selon votre outil :

# Console du gestionnaire de packages
Install-Package OneOf

# .NET CLI
dotnet add package OneOf

# PackageReference (manuellement dans .csproj)
<PackageReference Include="OneOf" Version="3.0.271" />

Après l'installation, ajoutez using OneOf; en haut de votre fichier.

Démarrage rapide

Prenons un exemple simple : une fonction qui divise un nombre par un autre. Au lieu de lever une exception en cas de division par zéro, nous retournerons OneOf<double, string> — soit le résultat, soit un message d'erreur.

using OneOf;

public OneOf<double, string> DivisionSecurisee(double a, double b)
{
    if (b == 0)
        return "Erreur : division par zéro";
    return a / b;
}

// Utilisation
var resultat = DivisionSecurisee(10, 2);

resultat.Switch(
    valeur => Console.WriteLine($"Résultat : {valeur}"),
    erreur => Console.WriteLine($"Erreur : {erreur}")
);

// Affichage : Résultat : 5

Remarquez : nous n'utilisons pas de paramètres out, nous ne vérifions pas null et nous n'attrapons pas d'exceptions. Tout ce dont nous avons besoin est d'appeler Switch ou Match et de fournir des gestionnaires pour chaque cas possible.

Méthodes et classes principales

La bibliothèque fournit plusieurs mécanismes clés pour travailler avec les unions discriminées. Examinons chacun d'eux en détail.

1. OneOf<T0, T1, ...>

Signature : public class OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> : IOneOf

Fonctionnement : Classe de base représentant une valeur qui peut être de l'un des types spécifiés. Prend en charge jusqu'à 9 types. Conversion implicite depuis n'importe lequel des types spécifiés vers OneOf.

OneOf<int, string, bool> valeur = 42; // conversion implicite
valeur = "bonjour";
valeur = true;

// Création explicite
var valeurExplicite = new OneOf<int, string>(100);

2. Switch

Signature : public void Switch(Action<T0> f0, Action<T1> f1, ...)

Fonctionnement : Exécute l'une des actions passées en fonction de la valeur stockée dans OneOf. Ne retourne rien.

Recommendations