Discriminated Unions in C#

Discriminated Unions in C#

02 Aug 2024 - Matthias Voigt

C# hat ein mächtiges Feature namens Discriminated Unions eingeführt, das es Entwicklern ermöglicht, Typen zu definieren, die verschiedene Formen annehmen können. Dieses Konzept, das oft in funktionalen Programmiersprachen zu finden ist, kann nun in C# genutzt werden, um robusteren und ausdrucksstärkeren Code zu schreiben.

Beispielimplementierung

Hier ein Beispiel, wie man Discriminated Unions in C# implementiert und verwendet:

using System;

union Shape
{
    Circle(double Radius);
    Rectangle(double Width, double Height);
    Square(double Side);
}

public class Program
{
    public static double CalculateArea(Shape shape) => shape switch
    {
        Circle(var radius) => Math.PI * radius * radius,
        Rectangle(var width, var height) => width * height,
        Square(var side) => side * side,
        _ => throw new ArgumentException("Unknown shape", nameof(shape))
    };

    public static void Main()
    {
        Shape myCircle = new Circle(5);
        Shape myRectangle = new Rectangle(4, 6);
        Shape mySquare = new Square(3);

        Console.WriteLine($"Fläche des Kreises: {CalculateArea(myCircle)}");
        Console.WriteLine($"Fläche des Rechtecks: {CalculateArea(myRectangle)}");
        Console.WriteLine($"Fläche des Quadrats: {CalculateArea(mySquare)}");
    }
}

Vorteile

  1. Klarheit: Vereinfachte Darstellung von Daten, die mehrere Formen annehmen können.
  2. Sicherheit: Reduziert Fehler durch Typprüfung zur Kompilierzeit.
  3. Pattern Matching: Nahtlose Integration mit dem Pattern Matching in C#.

Nachteile

  1. Komplexität: Erhöhte Komplexität bei der Typverwaltung und -inferenz.
  2. Kompatibilität: Mögliche Kompatibilitätsprobleme mit älteren Tools und Bibliotheken.
  3. Feature-Einschränkungen: Nicht alle Features von funktionalen Sprachen sind verfügbar.

Fazit

Discriminated Unions erweitern die Fähigkeit von C#, komplexe Datenstrukturen zu handhaben, und bieten ausdrucksstärkeren und sichereren Code. Entwickler sollten jedoch die potenziellen Nachteile, einschließlich erhöhter Komplexität und Kompatibilitätsproblemen, berücksichtigen.

Für mehr Informationen kannst du das Type Unions Proposal nachlesen.