Verständnis delegates und Events in C# mit einem konkreten Beispiel
So, ich bin an dem Punkt, der ein Verständnis der Ereignisse und Delegaten.
Ich overally verstehen, die Verwendung von Delegierten.
Die einzige Sache, die mir sorgen über die Delegierten, ob ein Delegierter kann konfiguriert werden, um mit Funktionen, die nicht in Bezug auf Ereignisse, die in irgendeiner Weise... wenn ja, wie Schreibe ich die Logik für eine delegate-Funktion definiert? (Ich denke, eine solche Funktion nicht wirklich viel von einen Punkt, um es, aber es ist gut zu wissen).
Als für Ereignisse... ich habe eine harte Zeit, es zu verstehen. Ich bekomme die Idee, dass ein Ereignis eine Funktion, die ausgeführt wird, wenn etwas passiert im code.
Allerdings habe ich nicht den Prozess der Erstellung einer Veranstaltung. Teilweise.
Dieser Frage verwende ich eine Antwort von Gary Willoughby: https://stackoverflow.com/a/803528/1104766
Es wurde geschrieben auf eine Frage aus, die ich zu verstehen versucht, dieses ganze Thema.
Was habe ich nicht bekommen, im obigen Beispiel:
MyObject.OnMaximum += new MyEventHandler(MaximumReached);
Erste, wie kann erstellen Sie eine Instanz des Delegaten, und übergeben Sie nur 1 variable, wenn es benötigt 2? Es muss etwas fehlt mir...
Das zweite, was über dieser Linie ist, dass die new ...()
Instanz wird Hinzugefügt der OnMaximum
Funktion, die sich in MyObject
eine Instanz von MyClass
- was genau ist OnMaximum
wenn eine solche Sache getan werden kann? Es wurde nie wirklich definiert zu!
if(OnMaximum != null) {
OnMaximum(this, new MyEventArgs("You've entered " +
value.ToString() +
", but the maximum is " +
Maximum.ToString()));
}
Als für diesen Teil OnMaximum
heißt aber Logik war nie wirklich definiert eine beliebige Stelle im code, also was könnte das Resultat sein? Offensichtlich ich denke, es würde dem text "Sie haben eingegeben............." aber meine Frage ist, um genauer zu sein, was passiert wirklich mit den Werten der Funktion/Ereignis erhält?
Markierte ich alle meine Fragen in FETT für Klarheit.
P. S, ich weiß, diese Frage in der Regel gepostet wurde ein paar mal.
Bitte beachten Sie, dass diese konkrete Frage bezieht sich auf eine Antwort geschrieben von einem anderen Mitglied und die Fragen, die hier gestellt werden, speziell auf dieses Beispiel. Das ist, warum solche Antworten nicht wirklich gefunden werden in google.
Für die Platte, allerdings habe ich die Suche, bevor ich gepostet, und ich wollte versuchen zu verstehen, aber ich denke, Beispiele sind der beste Weg für mich, um etwas zu verstehen, vor allem, wenn meine Kenntnisse der englischen CS Vokabular fehlt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie leiden möglicherweise an einer überdosis syntaktischen Zucker!
Sehen Sie, alle ein Ereignis ist, ist ein Delegierter. Eigentlich, um ehrlich zu sein, es ist eine Sammlung von Delegierten, die möglicherweise sein kann
null
.Nehmen wir ein Beispiel:
Alle event-Schlüsselwort gibt uns hier die Möglichkeit zum hinzufügen und entfernen von Listener event...
Delegierter auf der anderen Seite, während Sie arbeiten genau wie wir gerade beschrieben haben, funktioniert eher Analog als Funktion Zeiger. Stellen Sie sich eine abstrakte renderer, ich könnte die Klasse als solche:
Das bedeutet, ich bin verpflichtet, um sich aus machen. Aber was ist, wenn die renderer nahm ein Delegierter?
Sind wir jetzt die Trennung Zusammensetzung.
Was bekomme ich an? Entweder besser, oder nicht? Im Fall von events, die ich bin, um die öffentliche zu werden Beobachter meiner Klasse. Sie reagieren kann. Im zweiten Fall habe ich die Definition von einem Benutzer bereitgestellte Stellvertretung führen Sie eine Nischen-Funktion, während ich behalten, die Mehrheit der Steuern.
Delegaten und Ereignisse sind meist das gleiche - aber es ist die design-Entscheidungen, die wir treffen, die feststellt, welche man geeignet ist.
Adresse deiner anderen Punkte, die Sie bringen, ein großartiges Beispiel der Ereignisse gegenüber den Delegierten. Wenn wir ändern Sie die alarm-Klasse oben, damit die Delegierten zurück
true
oderfalse
wird, was passiert dann?Würden wir bekommen mehrere Beobachter "true" zurückgeben, aber wer Recht hat und wie überprüfen wir diese?
Unten die einzelnen Delegierten route, aber... "Rendern erfolgreich" oder "Render failed". Eine änderung dieses einzelnen delegieren, ist nicht so sehr ein Problem. Wir können prädiktiv zu testen, ob unsere renderer hat die Aufgabe:
Können wir nicht wirklich tun, dass mit Veranstaltungen. Gut, nicht vorhersagbar.
Einfacher gesagt, Ereignisse sind da, wenn Sie übertragen wollen etwas, und lassen Sie jemand anderes tun, etwas am Eingang der Veranstaltung. Die Bombe ging Los... Laufen, verstecken, rufen die Nationalgarde, schalten Sie den Ofen, oder Ente und Abdeckung.
Delegierten ermöglichen es Ihnen, Ihre Funktionen, ohne dass Sie das Modell (die Delegierten Folgen eine Unterschrift!). Großartiges Beispiel für einen Delegaten, ist, wenn Sie anrufen
List<T>.Sort
. Das ist ein Delegierter. Es hat eine Signatur.Aber Sie können Sie auch für anspruchsvollere Dinge wie das verändern eines
Renderer
Klasse ohne Rückgriff auf Schnittstellen und liefern zu können ein Benutzer-definiert "snippet". Ich denke, die einfachste Analogie wäre hier owner-drawn-Steuerelemente in Win32. Keine Notwendigkeit zum überschreiben der gesamten Klasse, keine Notwendigkeit, um eine Schnittstelle und schreiben zu viel code. Nur ändern Sie das bit, das macht das Element im Kombinationsfeld. Die Delegierten sind großartige Beispiele dafür, wie könnten Sie erreichen, dass.myevent
undmyotherevent
gleich dieMaximumReached
Funktion/Hörer erklärt, in der Frage, die ich verlinkt? Bedeutet das, dass, wenn ein Ereignis aufgerufen wird, wiesomeHandler(int num)
feuert alle seine Zuhörer UND übergibt Ihnen die verfügbaren Variablen? Das muss auch bedeuten, dass alle Listener zugewiesen, um einen handler erhalten/Rückgabe die gleiche Art/Menge der Variablen, richtig? macht Sinn - Danke! Allerdings bin ich immer noch nicht ganz verstehen, Ihren letzten Beispiel... könnte Es mir wirklich helfen, wenn Sie könnte ein Beispiel für beide Verwendungen mit/ohne delegieren (auch eine theoretische Art und Weise tun würde).invoke()
Teil irgendwie verwirrt mich (ich wollte nicht lernen, die renderer-Klasse noch so, dass das problem sein könnte) ABER, der rest machte es mir klar: Veranstaltungen grundsätzlich aufmerksame Zuhörer über etwas, das die Zuhörer reagieren dann entsprechend, um den Delegierten das setzt irgendeine Art von Beschränkungen für den Zuhörer, sein Verhalten, habe ich Recht?... Die Delegierten können Funktionen teilen ähnliche Signatur bei, sodass unterschiedliche Logik. Ein gutes Beispiel dafür wäre eine Person. Alle Personen sind Personen, aber Sie alle look anders aus... Wenn das Sinn macht.public Renderer(RenderDelegate)
- ein Delegierter zu erhalten und nicht eine Erscheinung als eine Funktion wie in Beispiel 1 hier: msdn.microsoft.com/en-us/library/aa288459(v=vs. 71).aspx . Werden müssen aufgrund der Tatsache, dass dies ist eine abstrakte Klasse, aber ich habe immer noch keine Ahnung, was das Verhalten in diesem Fall.Den tutorials in der MSDN werden alle Ihre Fragen beantworten:
Delegierten: http://msdn.microsoft.com/en-us/library/aa288459(v=vs. 71).aspx
Veranstaltungen: http://msdn.microsoft.com/en-us/library/aa645739(v=vs. 71).aspx
Come on Guys! Alle von Ihnen erfolgreich zu kompliziert die DELEGIERTEN :)!
Werde ich versuchen, zu verlassen, ein Tipp hier : ich habe verstanden Delegierten sobald ich merkte jquery-ajax-Aufrufe in Javascript. für ex: ajax.send(url, Daten, successcallback, failcallback) ist die Signatur der Funktion. wie Sie wissen, es sendet Daten an die server-URL als Antwort, Es könnte sein, 200OK oder einige andere Fehler. Im Falle einer solchen Veranstaltung(Erfolg/scheitern), Sie möchten eine Funktion ausführen. So, dies wirkt wie ein Platzhalter für eine Funktion, in der Lage sein zu erwähnen, die entweder Erfolg oder Misserfolg.
Platzhalter können nicht sehr allgemein gehalten - es akzeptieren können eine Reihe von Parameter und/kann nicht return-Wert. Diese Erklärung solcher Platzhalter, wenn man in C# heißt DELEGIEREN! Wie javascript-Funktionen, die nicht streng mit der Anzahl der Argumente, würden Sie nur sehen, Sie als GENERISCHE Platzhalter...aber C# hat einige STRENGE Erklärungen... das läuft darauf hinaus, DELEGATE-Deklarationen!!
Hoffe, es hilft!