13 Stimmen

Gibt es einen Fall, in dem Delegat Syntax über Lambda-Ausdruck für anonyme Methoden bevorzugt wird?

Bedeutet die Einführung neuer Funktionen wie Lambda-Ausdrücke (Inline-Code), dass wir keine Delegierten oder anonymen Methoden mehr verwenden müssen? In fast allen Beispielen, die ich gesehen habe, ist es für die Neuschreibung mit der neuen Syntax.

Jeder Ort, wo wir immer noch Delegaten und Lambda-Ausdrücke verwenden müssen wird nicht funktionieren?

0 Stimmen

27voto

James Newton-King Punkte 46367

Ja, es gibt Stellen, an denen die direkte Verwendung anonymer Delegierter und Lambda-Ausdrücke nicht funktioniert.

Wenn eine Methode einen nicht typisierten Delegaten aufnimmt, weiß der Compiler nicht, in was er den anonymen Delegaten/Lambda-Ausdruck auflösen soll, und Sie erhalten einen Compilerfehler.

public static void Invoke(Delegate d)
{
  d.DynamicInvoke();
}

static void Main(string[] args)
{
  // fails
  Invoke(() => Console.WriteLine("Test"));

  // works
  Invoke(new Action(() => Console.WriteLine("Test")));

  Console.ReadKey();
}

Bei der fehlerhaften Codezeile wird der Compilerfehler "Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type" ausgegeben.

0 Stimmen

Ich denke, der Fragesteller fragt nach delegate Schlüsselwort zugunsten einer neueren Lambda-basierten Syntax veraltet ist. Sie fasst "anonyme Methoden und Delegierte" zusammen.

8voto

Darren Kopp Punkte 74401

Lambda ist eine Abkürzung für anonyme Delegaten, aber Sie werden immer mit Delegaten. der Delegat gibt die Methoden-Signatur. Sie können einfach dies tun:

 delegate(int i) { Console.WriteLine(i.ToString()) }

kann ersetzt werden durch

f => Console.WriteLine(f.ToString())

7voto

Dandikas Punkte 2418

Der Lambda-Ausdruck ist kein Allheilmittel, das Delegierte ersetzen (ausblenden) würde, und sollte dies auch nicht sein. Es ist großartig mit kleinen lokalen Dinge wie:

List<string> names = GetNames();
names.ForEach(Console.WriteLine);
  1. er macht den Code lesbarer und damit einfacher zu verstehen.
  2. Das macht den Code kürzer und damit weniger Arbeit für uns ;)

Andererseits ist es sehr einfach, sie zu missbrauchen. Lange oder/und komplexe Lambda-Ausdrücke neigen dazu, zu sein:

  1. Schwer zu verstehen für neue Entwickler
  2. Weniger objektorientiert
  3. Viel schwieriger zu lesen

"Heißt das, dass wir keine Delegierten oder anonymen Methoden mehr verwenden müssen?" Nein - verwenden Sie Lambda-Ausdruck, wo Sie gewinnen Zeit/Lesbarkeit sonst erwägen, mit Delegaten.

0 Stimmen

WOW!!! Das hätte ich nie für möglich gehalten! Gibt es eine Möglichkeit, auch Prädikat zu tun, d.h. names.Where(!string.IsNullOrEmpty)); ? Ich habe es versucht, aber es funktioniert nicht bei mir. Ups! Wenn ich den ! Operanden entferne, funktioniert es, warum? Ich habe sogar versucht, es in Klammern zu setzen, aber es kann es nicht ganz aufrufen, gibt es einen Weg? Wir versuchen eigentlich, string.IsNullOrEmpty in string.IsNotNullOrEmpty zu konvertieren...

5voto

nawfal Punkte 65966

Eine nicht so groß Vorteil für die Älteren delegate Syntax ist, dass Sie die Parameter nicht angeben müssen, wenn Sie sie nicht im Körper der Methode verwenden. Von msdn

Es gibt einen Fall, in dem eine anonyme Methode Funktionalität bietet die es in Lambda-Ausdrücken nicht gibt. Anonyme Methoden ermöglichen das Weglassen von die Parameterliste weglassen. Dies bedeutet, dass eine anonyme Methode in Delegierte mit einer Vielzahl von Signaturen umgewandelt werden. Dies ist nicht mit Lambda-Ausdrücken nicht möglich.

Das können Sie zum Beispiel tun:

Action<int> a = delegate { }; //takes 1 argument, but not specified on the RHS

Während dies nicht gelingt:

Action<int> a = => { }; //omitted parameter, doesnt compile.

Diese Technik ist vor allem beim Schreiben von Event-Handlern nützlich, wie z.B.:

button.onClicked += delegate { Console.WriteLine("clicked"); };

Dies ist keine stark Vorteil. Imho ist es besser, immer die neuere Syntax zu verwenden.

1 Stimmen

Eigentlich war ich seit heute früh auf der Suche nach einem Anwendungsfall, warum sollte ich ein Argument in einer Methodensignatur angeben, es aber nicht im Methodenkörper verwenden :P. Event-Handler scheint ein Beispiel zu sein, aber trotzdem 1 . Das Fehlen von Parametern trägt zur Verwirrung bei. 2 . Morgen, wenn ich eine der folgenden Möglichkeiten nutzen muss object sender, EventArgs e Parameter, dann sollte der Entwickler diesen speziellen Compiler-Trick kennen, der nicht so offensichtlich ist. Für mich ist es ein Daumen nach unten vom Standpunkt der Funktionalität aus, nur um zwei Wörter Tipparbeit zu sparen. Ich stimme mit Ihnen überein - Dies ist kein großer Vorteil

4voto

JacquesB Punkte 40790

Delegate hat in C# zwei Bedeutungen.

Das Schlüsselwort delegate kann verwendet werden, um einen Funktionssignaturtyp zu definieren. Dies wird in der Regel verwendet, wenn die Signatur von Funktionen höherer Ordnung definiert wird, d.h. von Funktionen, die andere Funktionen als Argumente annehmen. Diese Verwendung von delegate ist immer noch relevant.

El delegate Schlüsselwort kann auch verwendet werden, um eine anonyme Inline-Funktion zu definieren. Wenn die Funktion nur ein einzelner Ausdruck ist, ist die Lambda-Syntax eine einfachere Alternative.

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