Discriminated Unions kommen (vielleicht) nach C#

Sascha Kiefer

C# entwickelt sich ständig weiter, und eines der spannendsten Features, das möglicherweise eingeführt wird, sind Discriminated Unions. Dieses Konzept ist Entwickler*innen in anderen Sprachen wie TypeScript bereits bekannt und bietet eine bessere Typensicherheit und Flexibilität im Code. Aber was genau sind Discriminated Unions, und wie könnten sie in C# implementiert werden?

Was sind Discriminated Unions?

Discriminated Unions sind eine Art von Union-Typ, bei dem eine gemeinsame Eigenschaft verwendet wird, um zwischen verschiedenen Typen innerhalb einer Union zu unterscheiden. Ein einfaches Beispiel könnte in Zukunft in C# so aussehen:

// Union Class
union Shape
{
    Circle(int radius);
    Rectangle(int width, int height);    
}

// Usage
Shape shape = new Circle(10);

Discriminated Unions verbessern die Typsicherheit erheblich, indem sie sicherstellen, dass alle möglichen Fälle einer Variable abgedeckt werden müssen; etwa in einer switch-Anweisung. Dies verhindert unerwartete Laufzeitfehler und fördert saubereren, sichereren Code.

// Pattern Matching
var area = shape switch
{
    Circle c => Math.PI * c.Radius * c.Radius,
    Rectangle r => r.Width * r.Height,    
};

Was sind die Vorteile von Discriminated Unions?

Typsicherheit: Discriminated Unions machen Code robuster, indem sie die Entwickler*innen zwingen, jeden möglichen Typfall zu behandeln.

Effiziente Handhabung mehrerer Typen: Statt zahlreiche Basisklassen oder Interfaces zu nutzen, können Discriminated Unions die verschiedenen Typen innerhalb einer Struktur definieren.

Besser lesbarer Code: Statt unsicheres Casting oder Typprüfungen zu verwenden, ist sofort klar, welche Typen erlaubt sind.

Wie könnten Discriminated Unions in C# implementiert werden?

C# plant, Discriminated Unions auf vielfältige Weise zu implementieren. Die TypeUnions-Proposal beschreibt fünf verschiedene Formen:

Union Classes

Diese sind für komplexere Typenhierarchien gedacht, in denen Klassen mit unterschiedlichen Eigenschaften, aber einem gemeinsamen Diskriminator verwendet werden.

Union Structs

ine ähnliche Idee wie Union Classes, aber mit Strukturen. Dies bietet den Vorteil einer besseren Speicherverwaltung, da Strukturen nicht auf dem Heap, sondern auf dem Stack gespeichert werden.

// Union Structs
union struct Shape
{
    Circle(int radius);
    Rectangle(int width, int height);    
}

Ad Hoc Unions

Hiermit können Typen dynamisch zu einer Union zusammenfefasst werden, ohne sie explizit vorher zu definieren. Dies ist nützlich in Szenarien, in denen Typen während der Laufzeit entschieden werden müssen.

// Ad Hoc Unions
record Circle(int radius);
record Rectangle(int width, int height);   

(Circle or Rectangle) shape = new Circle(10);

Custom Unions

Entwicklern wird ermöglicht, eigene spezialisierte Union-Typen zu erstellen, die auf spezifische Bedürfnisse zugeschnitten sind.

// Custom Unions
[Union]
public struct Shape
{
    public record Circle(int radius);
    public record Rectangle(int width, int height);

    public bool TryGetCircle(out Circle? circle) { ... }
    public bool TryGetRectangle(out Rectangle? rectangle) { ... }
}

Common Unions

Diese Art von Unions könnte in der Standardbibliothek von C# definiert werden, um häufig verwendete Muster zu unterstützen, wie etwa Option oder Result-Typen.

// Common Unions
public union struct Option<T>
{
    Some(T value);
    None = default;
}

public union struct Result<T, TError>
{
    Success(T value);
    Error(TError error);
}

Fazit

Die Einführung von Discriminated Unions in C# könnte die Art und Weise, wie Typen gehandhabt werden, grundlegend verändern. Dieses Feature würde Entwicklern nicht nur mehr Kontrolle und Sicherheit bei der Verwendung unterschiedlicher Datentypen bieten, sondern auch den Code lesbarer und wartungsfreundlicher machen. Bleibt abzuwarten, ob und wann dieses langersehnte Feature den Weg in die C#-Welt findet.

Das Feature ist noch in der Diskussion und könnte sich bis zur finalen Implementierung noch ändern. Gerne könnt ihr euch an der Diskussion beteiligen und Feedback geben: Type Unions for C# Proposal

Keinen Artikel mehr verpassen

Kein Spam. Nur relevante News über und von uns. Jederzeit abbestellbar.