Auf Englisch heißen sie Local Functions. Diese Funktion gibt es erst ab C# 7.0.
Zuvor haben wir den Aufruf von Methoden behandelt. Innerhalb eines Methodenblocks können weitere Methoden aufgerufen werden, wobei folgende Regeln gelten:
- Methoden innerhalb derselben Klasse: Direkt mit Methodennamen und Übergabe von Parametern aufrufen;
- Methoden aus einer anderen Klasse: Zuerst eine Instanz der entsprechenden Klasse erstellen, zudem muss die Zielmethode mit
publicgekennzeichnet sein.
Ab C# 7.0 lassen sich innerhalb einer Methode eigenständige Funktionen definieren, diese werden alslokale Funktionenbezeichnet:
- Isolation: Sie können nur aus der umschließenden äußeren Methode heraus aufgerufen werden, externer Code hat keinen Zugriff;
- Vorteile: Die Logik wird gebündelt, die Lesbarkeit steigt und die Wartung vereinfacht sich;
- Deklarationsregel: Im Gegensatz zu lokalen Variablen lassen sich lokale Funktionen an beliebiger Stelle innerhalb der äußeren Methode definieren, eine vorherige Deklaration ist nicht nötig.
Lokale Funktionen können lokale Variablen der äußeren Methode erfassen, ihr Gültigkeitsbereich bleibt jedoch auf die umschließende Methode beschränkt.
Zuerst ergänzen wir einen wichtigen Grundbegriff:
Lokale Variablen innerhalb einer Funktion werden von oben nach unten ausgeführt. Eine Variable muss deklariert werden, bevor sie verwendet wird, eine umgekehrte Reihenfolge ist nicht zulässig.
Sehen Sie sich folgenden Code an: hour wird erst später erstellt und kann nicht vor seiner Erstellung angesprochen werden.
int GetHours()
{
Console.WriteLine(hour);
int hour = DateTime.Now.Hour;
return hour;
}Code-Sprache: C# (cs)
Obwohl der Gültigkeitsbereich von hour den gesamten Methodenrumpf umfasst, darf die Variable nicht vor der Erstellung verwendet werden.

Es erscheint ein Fehler mit roter Wellenunterstreichung, die Fehlermeldung ist wie im obigen Bild dargestellt.
Das unterscheidet sich von Funktionen allgemein. Eine unten definierte Funktion kann eine obere Funktion aufrufen. Klassenmethoden gehören zu den Klassenmitgliedern und werden in der Method Table (Methodentabelle) abgelegt. Beim Aufruf wird diese Tabelle abgefragt, der Ablauf folgt nicht streng der Reihenfolge von oben nach unten.

Im folgenden Beispiel ruft die obere Main-Methode die später definierte GetHours-Methode auf. Das funktioniert anders als die Regeln zur Definition und Nutzung lokaler Variablen.
class Program
{
static void Main()
{
Program program = new Program();
program.GetHours();
}
int GetHours()
{
int hour = DateTime.Now.Hour;
return hour;
}
}Code-Sprache: C# (cs)
Kehren wir nun zu den lokalen Funktionen zurück.
Schauen wir uns das Beispiel an:
class Program
{
static void Main()
{
Program program = new Program();
program.ZoomIn();
}
public void ZoomIn()
{
// Man darf die lokale Funktion bereits vor ihrer Definition aufrufen
int results0 = ZoomIn5(10);
Console.WriteLine($"A: {results0}");
// Lokale Funktion: Multipliziert den übergebenen Wert val mit 5 und gibt das Ergebnis zurück
int ZoomIn5(int val)
{
return val * 5;
}
// Aufruf der lokalen Funktion
int results = ZoomIn5(10);
Console.WriteLine($"B: {results}");
int results2 = ZoomIn5(5);
Console.WriteLine($"C: {results2}");
}
}
Code-Sprache: C# (cs)
Der Gültigkeitsbereich einer lokalen Funktion liegt innerhalb der umschließenden Methode. Egal ob der Aufruf vor oder nach der Definition der lokalen Funktion steht, der Zugriff funktioniert.
Zusätzlich darf eine lokale Funktion sogar denselben Namen haben wie die äußere umschließende Methode.
class Program
{
static void Main()
{
Program program = new Program();
program.ZoomIn5();
}
public void ZoomIn5()
{
// Man darf die lokale Funktion bereits vor ihrer Definition aufrufen
int results0 = ZoomIn5(10);
Console.WriteLine($"A: {results0}");
// Lokale Funktion: Multipliziert den übergebenen Wert val mit 5 und gibt das Ergebnis zurück
int ZoomIn5(int val)
{
return val * 5;
}
// Aufruf der lokalen Funktion
int results = ZoomIn5(10);
Console.WriteLine($"B: {results}");
int results2 = ZoomIn5(5);
Console.WriteLine($"C: {results2}");
}
}
Code-Sprache: C# (cs)
In diesem Beispiel tragen sowohl die äußere Methode als auch die lokale Funktion den Namen ZoomIn5. Es entsteht kein Namenskonflikt, weil sich ihre Gültigkeitsbereiche unterscheiden. Trotzdem wird diese Schreibweise nicht empfohlen.
Lokale Funktionen