Die Situation kennen viele von euch: Ihr implementiert in einer Klasse eine Berechnung. Diese wird in mehrere Funktionen aufgeteilt, damit das übersichtlicher und leichter verständlich wird. Das funktioniert ganz gut, wenn jede Berechnung eine eigene Klasse erhält. Manchmal enthält sie jedoch mehrere davon (was in manchen Fällen durchaus sinnvoll sein kann). Für diesen Fall wurden Local Functions geschaffen.
Mit Hilfe der Local Functions kann ich eine Funktion im Kontext einer anderen Methode erstellen. Damit hat sie eine eindeutige Zugehörigkeit und ist in diesem Kontext leichter zu verstehen. Sinnvoll ist dies jedoch nur dann, wenn diese Function nur für eine aufrufende Stelle benötigt wird.
Bis jetzt kennen wir solche Konstrukte:
public int Calculate(int x, int y, int count)
{
var sum = 0;
for (int i = 0; i < count; i++)
{
sum += ComplexCalculation(x, y);
}
return sum;
}
private int ComplexCalculation(int x, int y)
{
return x + y;
}
Unter Verwendung einer Local Function sieht das so aus:
public static int LocalCalculation(int x, int y, int count)
{
var sum = 0;
for (int i = 0; i < count; i++)
{
sum += LocalComplexCalculation(x, y);
}
return sum;
int LocalComplexCalculation(int a, int b)
{
return a + b;
}
}
Es wird sichergestellt, dass die Local Function nur aus der umliegenden Methode aufgerufen werden kann. Eine versehentliche Verwendung aus einem anderen Bereich der Klasse ist nicht möglich. Auf Methoden-Variablen kann aus einer Local Function heraus zugegriffen werden. Auch werden mehrere Local Functions innerhalb eines Kontextes unterstützt.
Eine async
-Unterstützung ist gegeben.
Generell stehe ich dieser neuen Funktionalität etwas skeptisch gegenüber. Sie sollte eher vorsichtig eingesetzt werden, da bei wirklich komplexen Vorgängen Methoden schnell übersichtlich werden und somit genau das Gegenteil erreicht wird. Dennoch: Viel Spaß bei der Verwendung.
Hi Norbert,
stehe dem nicht so “skeptisch” gegenüber, da ich das im Jahre 1981 so in “Pascal” während meines Informatik-Studiums gelernt habe. Damit sollte die Sichtbarkeit verbessert werden. Niklaus Wirth von der ETH Zürich wird sich dabei was gedacht haben.