OneOf für C# (.NET): Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

OneOf für C# (.NET): Vollständige Anleitung mit Beispielen

Die Bibliothek OneOf ist eine Implementierung von diskriminierten Unions (discriminated unions) für die Sprache C#. Sie löst ein grundlegendes Problem: Wie kann man in einer statisch typisierten Sprache elegant einen Wert darstellen, der einer von mehreren vordefinierten Typen sein kann? Anstatt object mit Typumwandlungen, Nullable oder komplexe Klassenhierarchien zu verwenden, bietet OneOf eine typsichere und ausdrucksstarke Möglichkeit, mit solchen Werten zu arbeiten.

Warum ist das sinnvoll? Erstens verbessert es die Lesbarkeit des Codes: Eine Methode, die OneOf<Success, Error> zurückgibt, macht sofort klar, dass die Operation entweder erfolgreich sein oder einen Fehler zurückgeben kann. Zweitens eliminiert es eine ganze Klasse von Fehlern, die durch falsche Typumwandlungen entstehen. Drittens zwingt OneOf den Entwickler, alle möglichen Fälle zu behandeln, was den Code zuverlässiger und vorhersagbarer macht. Dies ist besonders nützlich in Szenarien, in denen traditionell Ausnahmen (für den Kontrollfluss) oder die Rückgabe von null verwendet werden.

OneOf fügt sich perfekt in den funktionalen Programmierstil in C# ein. Es ermöglicht eine präzisere Modellierung der Domäne: Anstatt eine Klasse Result mit Flags und verschachtelten Objekten zu haben, können Sie OneOf<T0, T1, T2> verwenden, wobei jeder Typ einen der möglichen Zustände repräsentiert. Dies macht den Code deklarativer und reduziert die Anzahl der if-else-Konstrukte.

Installation

Die Installation der Bibliothek erfolgt über den NuGet Package Manager. Führen Sie je nach Ihrem Tool einen der folgenden Befehle aus:

# Package Manager Console
Install-Package OneOf

# .NET CLI
dotnet add package OneOf

# PackageReference (manuell in .csproj)
<PackageReference Include="OneOf" Version="3.0.271" />

Fügen Sie nach der Installation using OneOf; am Anfang Ihrer Datei hinzu.

Schnellstart

Betrachten wir ein einfaches Beispiel: Eine Funktion, die eine Zahl durch eine andere dividiert. Anstatt eine Ausnahme bei einer Division durch Null zu werfen, geben wir ein OneOf<double, string> zurück – entweder das Ergebnis oder eine Fehlermeldung.

using OneOf;

public OneOf<double, string> SafeDivide(double a, double b)
{
    if (b == 0)
        return "Fehler: Division durch Null";
    return a / b;
}

// Verwendung
var result = SafeDivide(10, 2);

result.Switch(
    value => Console.WriteLine($"Ergebnis: {value}"),
    error => Console.WriteLine($"Fehler: {error}")
);

// Ausgabe: Ergebnis: 5

Beachten Sie: Wir verwenden keine out-Parameter, prüfen nicht auf null und fangen keine Ausnahmen. Alles, was wir brauchen, ist der Aufruf von Switch oder Match mit den entsprechenden Handlern für jeden möglichen Fall.

Wichtige Methoden und Klassen

Die Bibliothek bietet mehrere Schlüsselmechanismen für die Arbeit mit diskriminierten Unions. Sehen wir uns diese im Detail an.

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

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

Funktion: Die Basisklasse, die einen Wert darstellt, der einer der angegebenen Typen sein kann. Unterstützt bis zu 9 Typen. Ermöglicht die implizite Konvertierung von jedem der angegebenen Typen in OneOf.

OneOf<int, string, bool> value = 42; // implizite Konvertierung
value = "hallo";
value = true;

// Explizite Erstellung
var explicitValue = new OneOf<int, string>(100);

2. Switch

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

Funktion: Führt eine der übergebenen Aktionen in Abhängigkeit davon aus, welcher Wert in OneOf gespeichert ist. Gibt nichts zurück.

Empfehlungen