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. CurryingWas 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?
|