Closures


Was sind Closures?

Ein "Closure" ist eine Funktion die ihre Umgebung in der sie deklariert ist bindet. Die Funktion kann Variablen innerhalb ihrer Umgebung referenzieren. Sie referenziert quasi variablen ihrer Eltern-Funktion.


In diesem Beispielen wird als Ergebnis 1 ausgegeben, da sich der Wert x auf 1 geändert hat und a() nach Veränderung der Variable gerufen wird.

Wie funktionieren Closures?

Im Beispiel hat "a" eine Referenz auf "x". Damit kann sich "x" ändern und der Aufruf von a() wird folglich den aktuellen Wert von "x" ausgeben. Die Variable "x" verlässt ihren lokalen Scope und steigt vom Stack zum Heap. Und das tut sie zudem ohne Boxing. Folgend wird dargestellt, wie der C# 2.0 Compiler das bewerkstelligt.

Wir sehen, auch in C# 1.0 lassen sich ohne anonyme Methoden Closures herstellen.

Wozu brauch ich Closures?

Closures können bei Multi-Threading oder Multi-Core Anwendung sehr hilfreich sein, da der Flaschenhals bei der Verwendung von Locks vermieden wird. Locks "sperren" ein Object für die Zeit der Thread-Verwendung. Andere Threads müssen auf die Freigabe des Locks warten.

Folgend ein Beispiel für Multithreading-Probleme bei der häufig mit Hilfe von Locks die Threads synchronisiert werden müssen.  Hier kann es zu Problemen kommen, wenn ein Thread nach Namen die mit "D" starten sucht und ein weiterer Thread nach _startingText verändert. Die Ergebnisse wären falsch. Eine Lösung wäre die Verwendung eines Locks. Das würde sich allerdings negativ auf die Gesamtperformace aufwirken. Ein Lösungsansatz ist die Verwendung einer anonymen Methode um ein Closures zu erstellen. Diese verwendet keine gemeinsam verwendeten Variablen ("shared states").

Mit der Funktion ClosureGetNamesStartingWith wurde der Code reduziert und angenommen die Variable "Names" wird nicht verändert, arbeitet sie konkurrierend auf mehreren Threads und auf mehreren CPUs ohne Thread-Synchronisierung.

Currying

Was ist Currying?

Currying reduziert die Anzahl der Parameterübergaben an eine Funktion und gibt eine Funktion mit n-1 Parametern zurück. Es gleicht damit der Funktionsüberladung.

High Order Functions

Was sind High Order Functions wie Map, Reduce, Filter?