Lokale Funktion vs Lambda C# 7.0
Ich freue mich auf die neuen Implementierungen in C# 7.0 und ich finde es interessant, dass Sie umgesetzt haben, lokale Funktionen, aber ich kann mir nicht vorstellen, ein Szenario, wo eine lokale Funktion wäre bevorzugt über einen lambda-Ausdruck, und was ist der Unterschied zwischen den beiden.
Ich verstehe, dass Lambda-Ausdrücke sind anonymous
Funktionen mittlerweile die lokalen Funktionen nicht, aber ich kann nicht herausfinden, eine Reale Welt Szenario, wo die lokale Funktion hat Vorteile gegenüber lambda-Ausdrücke
Jedes Beispiel, das wäre sehr geschätzt werden. Danke.
Generika, out-Parameter, rekursive Funktionen, ohne zu initialisieren, die lambda null, etc.
Sollten Sie diesen post als Antwort.
Sollten Sie diesen post als Antwort.
InformationsquelleAutor Sid | 2016-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies erklärt Mads Torgersen in C# Design-Meeting-Notizen, wo die lokalen Funktionen wurden zum ersten mal besprochen:
Erweitern es einige mehr, die Vorteile sind:
Leistung.
Beim erstellen einen lambda-Ausdruck, ein Delegat erstellt werden, die eine unnötige Zuweisung in diesem Fall. Lokale Funktionen sind eigentlich nur Funktionen, keine Delegierten sind notwendig.
Auch lokale Funktionen sind effizienter erfassen von lokalen Variablen: lambdas in der Regel erfassen von Variablen in einer Klasse, während lokale Funktionen verwenden kann, ein struct (bestanden mit
ref
), was wiederum verhindert eine Zuweisung.Bedeutet dies auch den Aufruf von lokalen Funktionen ist billiger und Sie können inline, möglicherweise zunehmende Leistung noch weiter.
Lokale Funktionen können rekursiv sein.
Lambdas können rekursiv sein, aber es erfordert umständlich code, wo Sie zunächst zuordnen
null
zu einer delegate-Variablen und dann die lambda. Lokale Funktionen können natürlich auch rekursiv sein (einschließlich gegenseitig rekursiv).Lokale Funktionen können generisch sein.
Lambda-Ausdrücke können nicht generisch sein, da Sie zugeordnet werden müssen, um eine variable mit einem konkreten Typ (dieser Typ kann die Verwendung generischer Variablen, die aus dem äußeren Umfang, aber das ist nicht das gleiche).
Lokalen Funktionen umgesetzt werden können, wie ein iterator.
Lambdas nicht verwenden können, die
yield return
(undyield break
) - Schlüsselwort implementierenIEnumerable<T>
-Rückkehr-Funktion. Lokale Funktionen können.Lokalen Funktionen besser Aussehen.
Dies ist nicht in der oben aufgeführten Zitat und könnte einfach nur meine persönliche Neigung, aber ich denke, dass die normale Funktion syntax sieht besser aus als die Zuweisung eines lambda-Ausdruck eine delegate-variable. Lokale Funktionen sind auch kürzer.
Vergleichen:
Es ist wahr, dass die Namen der parameter des Lambda-Ausdrücke sind nicht erhalten, aber das ist, weil Sie haben, um umgewandelt werden zu Delegierten, die haben Ihre eigenen Namen. Zum Beispiel:
Func<int, int, int> f = (x, y) => x + y; f(arg1:1, arg2:1);
.Tolle Liste! Allerdings kann ich mir vorstellen, wie die IL/JIT-compiler ausführen konnten alle Optimierungen erwähnt in 1. auch für Delegierte, wenn Ihre Nutzung hält sich an gewisse Regeln halten.
Wenn Sie denken, dass die Optimierung wäre eigentlich Wert hinzufügen, möchten Sie vielleicht, um ein Problem zu schaffen, über die Ihr auf der Roslyn oder CoreCLR repo.
Da die lambdas verwenden Sie immer eine Stellvertretung und Stellvertretung hält die Schließung als ein
object
. So, Lambda-Ausdrücke verwenden könnte, eine Struktur, aber es würde geschachtelt werden, so würden Sie immer noch, dass zusätzliche Mittel zugewiesen werden.InformationsquelleAutor svick
Neben svick tolle Antwort es gibt einen weiteren Vorteil gegenüber lokalen Funktionen:
Sie kann definiert werden überall in der Funktion, auch nach der
return
- Anweisung.#region Helpers
an der Unterseite der Funktion, so, um Unordnung zu vermeiden, dass innerhalb dieser Funktion und espically vermeiden Sie Unordnung in der main-Klasse.InformationsquelleAutor Tim Pohlmann
Wenn Sie sich auch Fragen, wie um vor Ort zu testen Funktion, die Sie überprüfen sollten,JustMock, da es die Funktionalität, es zu tun. Hier ist ein einfaches Beispiel zur Klasse, die getestet werden:
Und hier ist, wie der test aussieht:
Hier ist ein link zu JustMock Dokumentation.
Haftungsausschluss. Ich bin einer der Entwickler verantwortlich für JustMock.
Hallo Johannes und vielen Dank für die freundlichen Worte. Als software-Entwickler sehe ich nicht ein, etwas besseres, als geschätzt durch meine Kunden für den Wert, den ich für Sie sorgen können. Kombinieren Sie das mit dem Wunsch nach Herausforderung und wettbewerbsfähige Arbeit und Sie erhalten eine ziemlich begrenzte Liste der Dinge, die ich wäre passioniert über. Schreiben Sie die Produktivität der Entwickler tooling ist auf dieser Liste. Zumindest in meinem Kopf:), Bezüglich der Karriere, ich denke, dass die Unternehmen, die Entwickler-Werkzeuge sind ein ganz kleiner Prozentsatz aller software-Unternehmen und das ist, warum es ist schwieriger zu finden, eine solche Gelegenheit.
Eine separate Frage. Warum rufst du nicht VerifyAll hier? Gibt es eine Möglichkeit zu sagen, JustMock, um zu überprüfen, die lokale Funktion aufgerufen wurde, zu?
Hi @JohnZabroski, das getestete Szenario nicht verlangen, die Geltendmachung vorkommen. Natürlich könnte man überprüfen, ob ein Anruf getätigt wurde. Zuerst müssen Sie angeben, wie viel Zeit Sie erwarten, dass die Methode aufgerufen werden. Wie diese:
.DoNothing().OccursOnce();
Und später behaupten, dass der Aufruf erfolgte durch den Aufruf derMock.Assert(foo);
Methode. Wenn Sie daran interessiert sind, wie andere Szenarien unterstützt Sie könnten, Lesen Sie unsere Assert Auftreten Hilfe-Artikel.InformationsquelleAutor Mihail Vladov
Ich Einsatz von inline-Funktionen zu vermeiden, garbage collection-Druck, speziell beim Umgang mit länger Laufenden Methoden. Sagen, man möchte zu bekommen, die 2 Jahre oder Markt-Daten für einen bestimmten ticker symbol. Auch kann man packen eine Menge Funktionalität und business-Logik, wenn man muss.
was man tut, öffnet eine socket-Verbindung zum server und Schleife über die Daten, die die Bindung eines Ereignis zu einem event. Man kann sich denken auf die gleiche Weise, wie sich eine Klasse entwickelt, nur einer ist nicht schriftlich helper-Methoden, die alle über dem Platz, die sind wirklich nur für ein Stück Funktionalität. nachfolgend finden Sie einige Beispiel, wie dies Aussehen könnte, bitte beachten Sie, dass ich mit den Variablen und die "Hilfs" - Methoden sind unter dem schließlich. In den Schließlich habe ich schön entfernen Sie den Ereignis-Handler, wenn meine Exchange-Klasse wäre extern/injiziert würde ich nicht alle noch anstehenden event-handler registriert
Können Sie sehen, die Vorteile, wie unten erwähnt, hier sehen Sie eine Beispiel-Implementierung. Hoffe, das hilft zu erklären, die Vorteile.
keine Weitergabe /kopieren von Variablen um, svick Antwort deckt den rest wirklich gut. Keine Notwendigkeit zu duplizieren seine Antwort
InformationsquelleAutor Computer Aided Trading Systems