127 Stimmen

_=> Was bedeutet dieser Unterstrich in Lambda-Ausdrücken?

Was bedeutet ein Lambda-Ausdruck wie _=> expr bedeuten?

Was ist der Zweck von _ als Eingabe für lambda?

Exemple :

int count = 0;
list.ForEach(_ => count += 1);

9 Stimmen

Hallo und willkommen bei StackOverflow. Ich habe mir die Freiheit genommen, Ihre Frage ein wenig zu bearbeiten, um Ihre Chance auf nützliche Antworten zu erhöhen, ich hoffe, Sie haben nichts dagegen.

1 Stimmen

Beachten Sie, dass unter der Annahme, dass list ist ein IEnumerable<T> könnten sie (und sollte) haben gerade verwendet sum = list.Count();

0 Stimmen

Ich vermute, dies kann verwendet werden, um zu verhindern, dass Sie den Bereich mit einem neuen Variablennamen "verschmutzen", der an anderer Stelle verwendet werden könnte, was einen Konflikt verursachen würde.

99voto

ChaosPandion Punkte 75527

Dies ist eine Konvention, die verwendet wird, wenn man sich nicht um den Parameter kümmert.

3 Stimmen

Das ist in Haskell und anderen funktionalen Sprachen häufiger der Fall. Ich denke, das ist der Grund, warum das so ist.

11 Stimmen

In Haskell, ML, Scala und anderen, _ ist das Platzhalterzeichen für den Mustervergleich. Es bedeutet im Grunde genommen "Es ist mir egal, ich siempre Das soll übereinstimmen". Dieses "Es ist mir egal" wird dann übernommen, wenn es darum geht Namensgebung Dinge, die Sie nicht interessieren, und von dort aus schwappt es in andere Programmiersprachen über. Es wird zum Beispiel auch in Ruby verwendet, um das Gleiche wie in diesem Beispiel zu meinen, auch wenn _ hat in Ruby absolut keine besondere Bedeutung.

0 Stimmen

@JörgWMittag Stimmt im Mai 2010, aber nicht ab Juni 2010. Tolles Timing! :) stackoverflow.com/q/6397078/38765

48voto

Lasse V. Karlsen Punkte 364542

Es handelt sich um einen Parameternamen, wenn auch nicht um einen nützlichen, aber es ist derjenige, der typischerweise (nach einigen Konventionen) verwendet wird, wenn Sie angeben müssen, dass der Ausdruck hat ein Parameter, damit der Code kompiliert werden kann, aber das ist Ihnen eigentlich egal, also ignorieren Sie es einfach.

Es ist im Grunde Ausnutzung der Syntax für das, was eine legale Bezeichner in C # darstellt, und da ein Bezeichner kann mit einem Unterstrich beginnen, und enthalten nichts anderes, es ist nur ein Parametername.

Sie hätten auch einfach schreiben können:

var _ = 10;

2 Stimmen

Können wir anstelle von _ auch () verwenden?

2 Stimmen

Haben Sie es damit versucht?

0 Stimmen

Ja, ich hatte es verwendet, als ich einen Thread mit Lambda-Ausdruck erstellt habe. Thread t= new Thread(()=>doSomething(x,y)); t.start();

34voto

_ ist ein gültiger Variablenname. Sie verwenden einfach _ als eine Variable.

11voto

vodkhang Punkte 18481

Da Lamda-Ausdrücke meist in kurzen, anonymen Codes verwendet werden, so dass der Name der Variablen manchmal nicht notwendig ist, auch wenn sie die Variable nicht im Code-Block verwenden, so dass sie nur ein _ für eine kurze, Konvention geben

9voto

MaDDoX Punkte 548

Ich befürworte auch die Verwendung von _ => _.method() für einzeilige, methodenaufrufende Lambdas, da es das kognitive Gewicht der Anweisung verringert. Speziell bei der Verwendung von Generika ist das Schreiben von x => x.method() fügt nur den Sekundenbruchteil einer Überlegung hinzu: "Was ist dieses 'x'? Ist es eine Koordinate im Raum?".

Betrachten Sie den folgenden Fall:

Initialize<Client> ( _=>_.Init() );

In Verbindung mit einem Generics-Aufruf dient der Unterstrich in diesem Fall als "Bypass-Symbol". Er vermeidet Redundanz, indem er festlegt, dass der Typ des Arguments offensichtlich ist und aus der Verwendung abgeleitet werden kann - genau wie bei der Verwendung von 'var', um die Wiederholung einer Typdeklaration zu vermeiden. Schreiben von client=>client.Init() würde die Anweisung nur länger machen, ohne ihr einen Sinn zu geben.

Dies gilt natürlich nicht für die an die Methode zu übergebenden Parameter, die beschreibend benannt werden sollten. Z. B.: Do( id=>Log(id) );

Die Verwendung eines einzelnen Underscore-Parameters für Methodenaufrufe ist kaum zu rechtfertigen, wenn ein Codeblock anstelle eines Einzeilers verwendet wird, da der Lambda-Bezeichner von seiner generischen Definition abgekoppelt wird. Wenn ein und derselbe Bezeichner wiederverwendet werden soll, sollte man ihm im Allgemeinen einen beschreibenden Namen geben.

Die Quintessenz ist, dass Ausführlichkeit nur zur Disambiguierung gerechtfertigt ist, insbesondere bei Lambdas, die in erster Linie zur Vereinfachung der Erstellung anonymer Delegaten geschaffen wurden. In jedem Fall sollte man den gesunden Menschenverstand walten lassen und zwischen Lesbarkeit und Prägnanz abwägen. Wenn das Symbol nur ein "Haken" zur eigentlichen Funktionalität ist, sind einstellige Bezeichner völlig in Ordnung. Das ist der Fall bei For-Schleifen und den Buchstaben "i" und "j" als Indexer.

2 Stimmen

+1 für diesen Ansatz! Ich dachte, ich wäre der einzige, der Unterstriche in Lambdas verwendet, um "die kognitive Last zu verringern" und nicht, um zu zeigen, dass dieser Parameter nicht verwendet wird. Mit Unterstrichen liest es sich einfacher, vor allem wenn es viele Verkettungen gibt und man sofort auf den Typ schließen kann, wie es bei LINQ-Abfragen oft der Fall ist!

3 Stimmen

Do(id => Log(id)) ist besser abgekürzt als Do(Log) .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X