Ich weiß, dass das seltsam klingen mag, aber ich weiß nicht einmal, wie ich diese Syntax im Internet durchsuchen soll, und ich bin mir auch nicht sicher, was genau das bedeutet.
Also habe ich mir MoreLINQ-Code angesehen und dann diese Methode bemerkt
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
return _(); IEnumerable<TSource> _()
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
}
}
Was ist diese seltsame Rückgabeanweisung? return _();
?
return _(); IEnumerable<TSource> _()
?return _(); IEnumerable<TSource> _()
als auf dasyield return
?return _(); IEnumerable<TSource> _()
. Er könnte eher durch die Art und Weise verwirrt sein, wie es aussieht, als durch die tatsächliche Rückgabeerklärung.Antworten:
Dies ist C # 7.0, das lokale Funktionen unterstützt ....
Aktuelles C # mit
Func<T>
Der Trick ist, dass _ () nach seiner Verwendung deklariert wird, was vollkommen in Ordnung ist.
Praktische Nutzung lokaler Funktionen
Das obige Beispiel ist nur eine Demonstration der Verwendung der Inline-Methode. Wenn Sie die Methode jedoch nur einmal aufrufen, ist dies höchstwahrscheinlich nicht von Nutzen.
Wie in den Kommentaren von Phoshi und Luaan erwähnt , bietet die Verwendung der lokalen Funktion im obigen Beispiel einen Vorteil. Da eine Funktion mit Ertragsrückgabe nur ausgeführt wird, wenn jemand sie wiederholt, wird in diesem Fall eine Methode außerhalb der lokalen Funktion ausgeführt und eine Parameterüberprüfung durchgeführt, selbst wenn der Wert von niemandem wiederholt wird.
Oft haben wir Code in der Methode wiederholt. Schauen wir uns dieses Beispiel an.
Ich könnte dies optimieren mit ...
quelle
_AnonymousFunction
oder nur_
, während ich erwarten würde, dass eine echte anonyme Funktion so etwas wie ist(x,y) => x+y
. Ich würde dies eine lokale Funktion nennen, bin aber nicht an die C # -Terminologie gewöhnt.yield return
erstellen, wird kein Code ausgeführt, bis die Aufzählung tatsächlich aufgezählt ist. Dies ist unerwünscht, da Sie beispielsweise Argumente sofort überprüfen möchten. Die einzige Möglichkeit, dies in C # zu tun, besteht darin, die Methode in zwei Methoden zu trennen - eine mityield return
s und die andere ohne. Mit Inline-Methoden können Sie dieyield
using-Methode im Inneren deklarieren , um Unordnung und möglichen Missbrauch einer Methode zu vermeiden, die streng intern und nicht wiederverwendbar ist.Betrachten Sie das einfachere Beispiel
_()
ist eine lokale Funktion, die in der Methode deklariert ist, die die return-Anweisung enthält.quelle