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
