Funktionale Programmierung in C#: Ein praktischer Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Funktionale Programmierung in C#: Ein moderner Ansatz für die Entwicklung



Funktionale Programmierung (FP) ist ein Paradigma, bei dem Berechnungen als Auswertung mathematischer Funktionen behandelt werden und die Änderung von Zuständen und veränderlichen Daten vermieden wird. Obwohl C# ursprünglich als objektorientierte Sprache entwickelt wurde, hat es ab Version 3.0 aktiv Elemente des funktionalen Ansatzes übernommen. Heute ist funktionale Programmierung in C# nicht nur ein modischer Trend, sondern ein leistungsstarkes Werkzeug zum Schreiben von vorhersehbarerem, testbarerem und nebenläufig-sicherem Code.



In diesem Artikel werden wir die wichtigsten FP-Konzepte in Bezug auf C# behandeln: reine Funktionen, Unveränderlichkeit von Daten, LINQ, Closures und Lambda-Ausdrücke. Sie werden sehen, wie diese Techniken helfen, prägnanten und zuverlässigen Code im .NET-Ökosystem zu schreiben.



1. Reine Funktionen und das Fehlen von Seiteneffekten



Eine reine Funktion ist eine Funktion, die:

  • Für dieselben Argumente immer dasselbe Ergebnis zurückgibt (referenzielle Transparenz).
  • Keine Seiteneffekte hat (keine globalen Variablen ändert, keine Ein-/Ausgabe durchführt, keine übergebenen Argumente verändert).


In C# kann eine reine Funktion so aussehen:



// Reine Funktionpublic int AddPure(int a, int b){    return a + b;}

// KEINE reine Funktion (Seiteneffekt — Ausgabe auf die Konsole und Änderung einer globalen Variable)private int _state = 0;public int AddImpure(int a, int b){ _state++; Console.WriteLine("Funktionsaufruf"); return a + b + _state;}


Die Vorteile reiner Funktionen liegen auf der Hand: Sie sind leicht zu testen, vorhersehbar und können sicher aus parallelen Threads aufgerufen werden. Versuchen Sie, die gesamte Logik, die nicht mit I/O zusammenhängt, in reine Funktionen auszulagern.



2. Unveränderlichkeit von Daten (Immutability)



Funktionale Programmierung fördert die Arbeit mit unveränderlichen Daten. Anstatt ein vorhandenes Objekt zu modifizieren, erstellen Sie ein neues Objekt mit geänderten Eigenschaften. In C# eignen sich dafür hervorragend:

  • record (ab C# 9) — ein Referenztyp mit wertbasierter Gleichheit und standardmäßiger Unveränderlichkeit.
  • struct — für kleine unveränderliche Strukturen (z. B. Koordinaten, Geldbeträge).
  • IEnumerable<T> — für unveränderliche Sammlungen über LINQ.


Beispiel mit record:



public record Person(string Name, int Age);

// Verwendung des with-Ausdrucks zum Erstellen einer Kopie mit Änderungenvar original = new Person("Alexej", 30);var updated = original with { Age = 31 };

Console.WriteLine(original); // Person { Name = Alexej, Age = 30 }Console.WriteLine(updated); // Person { Name = Alexej, Age = 31 }


Dieser Ansatz verhindert die versehentliche Änderung von Daten an einer Stelle, die andere Teile des Programms beeinflusst.



3. LINQ — Funktionale Datenabfragen



LINQ (Language Integrated Query) ist wohl das bekannteste Beispiel für den funktionalen Ansatz in C#. Es ermöglicht die Verarbeitung von Sammlungen in einem deklarativen Stil unter Verwendung von Methodenketten.



Wichtige funktionale LINQ-Methoden:

  • Select — Transformation jedes Elements (Analogon zu map).
  • Where — Filterung (Analogon zu filter).
  • Aggregate — Faltung (Analogon zu reduce).
  • SelectMany — Entfaltung verschachtelter Sammlungen (flatMap).


Beispiel: Summe der Quadrate gerader Zahlen finden.



int[] numbers = { 1, 2, 3, 4, 5, 6 };

// Imperativer Stilint sumImperative = 0;foreach (var num in numbers){ if (num % 2 == 0) { sumImperative += num * num; }}

// Funktionaler Stil mit LINQint sumFunctional = numbers .Where(n => n % 2 == 0) // Filterung .Select(n => n * n) // Transformation .Sum(); // Aggregation

C

Blogs

Buchempfehlungen