Discriminated Unions in C#

Discriminated Unions in C#

- Matt

Discriminated Unions erlauben es, einen Typ zu definieren, der genau eine von mehreren möglichen Formen annimmt. Dieses Konzept, das oft in funktionalen Programmiersprachen zu finden ist und gut zur erweiterten Mustererkennung passt, 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: Greift direkt mit dem Pattern Matching in C# ineinander.

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.