Ich glaube, ich verstehe das Konzept eines Delegaten in C # als einen Zeiger auf eine Methode, aber ich kann keine guten Beispiele dafür finden, wo es eine gute Idee wäre, sie zu verwenden. Was sind Beispiele, die mit Delegierten entweder deutlich eleganter / besser sind oder mit anderen Methoden nicht gelöst werden können?
Was genau meinen Sie mit den Delegierten? Hier sind zwei Möglichkeiten, wie sie verwendet werden können:
%Vor%und
%Vor% Der Punkt in der zweiten ist, dass Sie neue Funktionen im laufenden Betrieb als Delegierte deklarieren können. Dies kann weitgehend durch Lambda-Ausdrücke ersetzt werden und ist immer dann nützlich, wenn Sie eine kleine Logik haben, die Sie 1) an eine andere Funktion übergeben möchten oder 2) einfach wiederholt ausführen möchten. LINQ ist ein gutes Beispiel. Jede LINQ-Funktion verwendet einen Lambda-Ausdruck als Argument und gibt das Verhalten an. Wenn Sie beispielsweise List<int> l
haben, ruft l.Select(x=>(x.ToString())
ToString () für jedes Element in der Liste auf. Und der Lambda-Ausdruck, den ich geschrieben habe, ist als Delegierter implementiert.
Der erste Fall zeigt, wie Select implementiert werden könnte. Sie nehmen einen Delegierten als Ihr Argument, und dann rufen Sie es bei Bedarf auf. Dadurch kann der Aufrufer das Verhalten der Funktion anpassen. Wenn Sie Select () erneut als Beispiel verwenden, garantiert die Funktion selbst, dass der Delegat, an den Sie übergeben werden, für jedes Element in der Liste aufgerufen wird, und die Ausgabe jedes Elements wird zurückgegeben. Was dieser Delegierte tatsächlich tut liegt bei Ihnen. Das macht es zu einer erstaunlich flexiblen und allgemeinen Funktion.
Natürlich werden sie auch für das Abonnieren von Veranstaltungen verwendet. Kurz gesagt, delegates erlauben Ihnen, Funktionen zu referenzieren, sie als Argument in Funktionsaufrufen zu verwenden, sie Variablen zuzuordnen und was Sie sonst noch tun möchten.
Ich verwende hauptsächlich die einfache asynch Programmierung. Das Starten einer Methode mit einer delegates Begin ... -Methode ist wirklich einfach, wenn Sie feuern und vergessen wollen.
Ein Delegat kann auch wie eine Schnittstelle verwendet werden, wenn keine Schnittstellen verfügbar sind. Z.B. Methoden von COM-Klassen, externen .Net-Klassen usw. aufrufen.
Ereignisse sind das offensichtlichste Beispiel. Vergleichen Sie, wie das Beobachtermuster in Java (Schnittstellen) und C # (Delegaten) implementiert wird.
Auch viele neue C # 3-Funktionen (zum Beispiel Lambda-Ausdrücke) basieren auf Delegaten und vereinfachen ihre Verwendung noch weiter.
Zum Beispiel in Multithread-Apps. Wenn Sie möchten, dass mehrere Threads eine Kontrolle verwenden, sollten Sie Delegaten verwenden. Entschuldigung, der Code ist in VisualBasic.
Zuerst deklarieren Sie einen Delegierten
%Vor%Schreiben Sie eine Funktion zum Aktivieren / Deaktivieren der Schaltfläche aus mehreren Threads
%Vor%Ich benutze sie die ganze Zeit mit LINQ, insbesondere mit Lambda-Ausdrücken, um eine Funktion zum Auswerten einer Bedingung oder zum Zurückgeben einer Auswahl bereitzustellen. Verwenden Sie sie auch, um eine Funktion bereitzustellen, die zwei Elemente zum Sortieren vergleicht. Letzteres ist wichtig für generische Sammlungen, für die die Standardsortierung geeignet sein kann oder auch nicht.
%Vor%Einer der Vorteile von Delegaten besteht in der asynchronen Ausführung.
Wenn Sie eine Methode asynchron aufrufen, wissen Sie nicht, wann sie ausgeführt wird. Sie müssen also einen Delegaten an diese Methode übergeben, der auf eine andere Methode verweist, die aufgerufen wird, wenn die erste Methode ausgeführt wurde. In der zweiten Methode können Sie Code schreiben, der Sie darüber informiert, dass die Ausführung abgeschlossen ist.
Technisch Delegieren ist ein Referenztyp, der zum Einkapseln einer Methode mit einer bestimmten Signatur und einem Rückgabetyp verwendet wird
Einige andere Kommentare berührten die asynchrone Welt ... aber ich werde trotzdem kommentieren, da mein Lieblingsgeschmack davon erwähnt wurde:
%Vor%Ein großer Grund für die Delegierten ist auch "CallBacks". Nehmen wir an, ich mache ein bisschen Funktionalität (asynchron), und Sie möchten, dass ich eine Methode (sagen wir "AlertWhenDone") aufruft ... Sie könnten einen "Delegaten" wie folgt an Ihre Methode übergeben:
%Vor%Außerhalb ihrer Rolle in Ereignissen, mit denen Sie wahrscheinlich vertraut sind, wenn Sie winforms oder asp.net verwendet haben, sind Delegaten nützlich, um Klassen flexibler zu machen (z. B. die Art, wie sie in LINQ verwendet werden).
Flexibilität für das Finden von Dingen ist ziemlich üblich. Sie haben eine Sammlung von Dingen, und Sie möchten eine Möglichkeit bieten, Dinge zu finden. Anstatt zu raten, auf welche Weise jemand die Dinge finden könnte, können Sie dem Anrufer nun erlauben, den Algorithmus bereitzustellen, damit er Ihre Sammlung nach eigenem Ermessen durchsuchen kann.
Hier ist ein einfaches Codebeispiel:
%Vor%Ausgabe
ist
testen
es gibt nicht wirklich etwas, das delgates lösen wird, das mit anderen Methoden nicht gelöst werden kann, aber sie stellen eine elegantere Lösung zur Verfügung.
Mit Delegaten kann jede Funktion verwendet werden, solange sie über die erforderlichen Parameter verfügt.
Die Alternative besteht oft darin, eine Art benutzerdefiniertes Ereignissystem im Programm zu verwenden, das zusätzliche Arbeit und mehr Bereiche für Bugs schafft, in die sich Fehler einschleichen können
Gibt es einen Vorteil, wenn Sie einen Delegaten bei externen Aufrufen einer Datenbank verwenden?
Zum Beispiel kann Code A:
%Vor%In Code B verbessert werden:
%Vor%Es scheint, dass dies subjektiv ist, aber ein Bereich, in dem es starke widersprüchliche Blickwinkel gibt?