Lokale Funktionen in C-Sharp (Local Functions)
Auf einen Blick
| Gilt für | C# 7.0 bis C# 14 (.NET 10); statische lokale Funktionen ab C# 8, Attribute ab C# 9 |
|---|---|
| Bereich | Softwareentwicklung |
| Dauer | ca. 10 Minuten Lesezeit |
| Rechte | – |
| Stand | Oktober 2026 |
Lokale Funktionen in C# (Local Functions) sind Methoden, die innerhalb einer anderen Methode definiert werden. Hilfslogik, die nur an einer Stelle gebraucht wird, bleibt so direkt beim Aufrufer, ist von außen nicht aufrufbar und macht Klassen übersichtlicher. Eingeführt mit C# 7, wurden sie in späteren Versionen um statische lokale Funktionen und Attribute erweitert.

Grundprinzip
public decimal Gesamtpreis(IEnumerable<Position> positionen, decimal rabattProzent)
{
if (rabattProzent is < 0 or > 100)
throw new ArgumentOutOfRangeException(nameof(rabattProzent));
return positionen.Sum(p => Netto(p) * (1 - rabattProzent / 100));
// lokale Funktion: nur innerhalb von Gesamtpreis sichtbar
decimal Netto(Position p) => p.Menge * p.Einzelpreis;
}
Die lokale Funktion darf am Ende der Methode stehen und trotzdem vorher aufgerufen werden – das hält den Hauptablauf oben lesbar.
Typische Einsatzfälle
Argumentprüfung bei Iteratoren und async-Methoden
Bei yield return und async laufen Prüfungen sonst erst beim ersten Durchlauf bzw. landen in der Task. Mit einer lokalen Funktion wird sofort geprüft:
public static IEnumerable<int> Bereich(int start, int anzahl)
{
ArgumentOutOfRangeException.ThrowIfNegative(anzahl); // greift sofort
return Iterator();
IEnumerable<int> Iterator()
{
for (var i = 0; i < anzahl; i++)
yield return start + i;
}
}
Rekursion ohne zusätzliche Klassenmethode
public static long Fakultaet(int n)
{
ArgumentOutOfRangeException.ThrowIfNegative(n);
return Berechne(n);
static long Berechne(int x) => x <= 1 ? 1 : x * Berechne(x - 1);
}
Statische lokale Funktionen (ab C# 8)
Mit static darf die lokale Funktion keine Variablen der umgebenden Methode verwenden („capturen“). Der Compiler meldet versehentliche Zugriffe als Fehler, und es entstehen keine versteckten Allokationen für Closures. Faustregel: lokale Funktionen standardmäßig static machen, solange sie keinen Zustand der Methode brauchen.
Lokale Funktion oder Lambda?
| Kriterium | Lokale Funktion | Lambda-Ausdruck |
|---|---|---|
| Rekursion | direkt möglich | nur über Umwege |
| Generische Typparameter | ja | nein |
yield return (Iterator) |
ja | nein |
| Speicher | meist ohne Heap-Allokation, mit static garantiert |
erzeugt einen Delegaten, ggf. mit Closure |
| Attribute an Funktion und Parametern | ja (ab C# 9) | ja (ab C# 10) |
| Als Wert übergeben (Delegat) | möglich, wird dann umgewandelt | ja, dafür gedacht |
Lambdas bleiben die erste Wahl für kurze Ausdrücke in LINQ-Abfragen und Event-Handlern; für mehrzeilige Hilfslogik sind lokale Funktionen lesbarer.
Hinweise
- Nicht übertreiben: Wird die Hilfslogik an mehreren Stellen gebraucht oder lässt sie sich sinnvoll testen, gehört sie in eine eigene (private) Methode.
- Verfügbarkeit: Lokale Funktionen funktionieren in allen aktuellen .NET-Versionen; auch .NET-Framework-Projekte können sie nutzen, wenn ein aktueller Compiler (Visual Studio 2022/2026) verwendet wird.
- Bei Architektur und Code-Qualität Ihrer .NET-Anwendungen unterstützt Sie die individuelle Softwareentwicklung von m.a.x. it.
Siehe auch
- HTML in C-Sharp bearbeiten mit AngleSharp
- .NET MAUI: MVVM mit dem CommunityToolkit.Mvvm statt MvvmLight
Links und Quellen
Über m.a.x. it Die m.a.x. Informationstechnologie AG ist seit über 30 Jahren IT-Partner mittelständischer und großer Unternehmen in München und bietet maßgeschneiderte Lösungen und Services in den Bereichen Cloud, Cybersecurity, Netzwerk, Windows, Linux und Softwareentwicklung. Sie haben eine Frage zu diesem Artikel oder brauchen Unterstützung?
