Abstrakte Visualisierung mit Type Unions Text, geometrischen Formen und Code-Elementen
Zurück zum Blog
dotnetc#Programmierung

Discriminated Unions kommen (vielleicht) nach C#

Sascha KieferEntwicklung

Discriminated Unions sind ein neues, möglicherweise bald in C# eingeführtes Feature, das Entwickler*innen erlaubt, Datentypen sicherer und flexibler zu handhaben.

C# entwickelt sich ständig weiter. Eines der spannendsten Features, die vielleicht kommen: Discriminated Unions. Wer mit TypeScript arbeitet, kennt das Konzept schon. Es bringt mehr Typsicherheit und Flexibilität in den Code. Aber was genau sind Discriminated Unions, und wie könnten sie in C# aussehen?

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);

Der große Gewinn ist die Typsicherheit: Alle möglichen Fälle einer Variable müssen abgedeckt werden, etwa in einer switch-Anweisung. Vergisst du einen, merkst du es vor der Laufzeit statt erst im Betrieb.

// 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: Jeder mögliche Typfall muss behandelt werden. Lücken fallen früh auf.

Mehrere Typen an einem Ort: Statt zahlreicher Basisklassen oder Interfaces definierst du die verschiedenen Typen innerhalb einer einzigen Struktur.

Besser lesbarer Code: Kein unsicheres Casting, keine verstreuten Typprüfungen. Man sieht sofort, welche Typen erlaubt sind.

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

Das TypeUnions-Proposal beschreibt gleich 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

Eine ähnliche Idee wie Union Classes, aber mit Strukturen. Das 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

Hier fasst du Typen spontan zu einer Union zusammen, ohne sie vorher explizit zu definieren. Praktisch, wenn erst zur Laufzeit feststeht, welcher Typ gebraucht wird.

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

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

Custom Unions

Damit baust du eigene Union-Typen für ganz bestimmte Anforderungen.

// 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

Mit Discriminated Unions würde sich ändern, wie wir in C# mit Typen umgehen. Du hättest mehr Kontrolle über unterschiedliche Datentypen, und der Code wäre leichter zu lesen und zu warten. Ob und wann das Feature kommt? Bleibt abzuwarten.

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

Brauchst du Unterstützung?

Features wie Discriminated Unions zahlen sich vor allem in der Domänenlogik aus, wo ungültige Zustände dann gar nicht erst darstellbar sind. Als .NET-Entwicklungspartner bauen wir wartbare C#-Architekturen für geschäftskritische Abläufe und halten sie offen für die Sprachfeatures, die als Nächstes kommen. Wenn deine Codebasis von modernem C# profitieren soll, sprich uns an.

.NET-Entwicklung bei vensas