Unterscheidung zwischen Delegaten und EreignissenDistinguishing Delegates and Events

ZurückPrevious

Entwickler, die die .NET Core-Plattform noch nicht kennen, haben oft mit der Entscheidung zwischen einem Entwurf auf der Grundlage von delegates und einem Entwurf auf der Grundlage von events zu kämpfen.Developers that are new to the .NET Core platform often struggle when deciding between a design based on delegates and a design based on events. Dies ist ein schwieriges Konzept, da die zwei Sprachfunktionen sehr ähnlich sind.This is a difficult concept, because the two language features are very similar. Ereignisse werden sogar mithilfe der Sprachunterstützung für Delegaten erstellt.Events are even built using the language support for delegates.

Beide bieten ein Szenario mit später Bindung: Sie ermöglichen Szenarios, in denen eine Komponente durch Aufrufen einer Methode, die nur zur Laufzeit bekannt ist, kommuniziert.They both offer a late binding scenario: they enable scenarios where a component communicates by calling a method that is only known at runtime. Beide Versionen unterstützen einzelne und mehrerer Methoden des Abonnenten.They both support single and multiple subscriber methods. Möglicherweise finden Sie dies unter der Bezeichnung Singlecast- und Multicast-Unterstützung.You may find this referred to as singlecast and multicast support. Beide unterstützen eine ähnliche Syntax zum Hinzufügen und Entfernen von Handlern.They both support similar syntax for adding and removing handlers. Schließlich verwenden das Auslösen eines Ereignisses und das Aufrufen eines Delegaten genau die gleiche Methodensyntax zu Aufrufen.Finally, raising an event and calling a delegate use exactly the same method call syntax. Auch unterstützen beide die gleiche Invoke()-Methodensyntax für die Verwendung mit dem ?.-Operator.They even both support the same Invoke() method syntax for use with the ?. operator.

Mit all diesen Ähnlichkeiten ist es einfach nur schwer zu bestimmen, wann welche Komponente benutzt werden soll.With all those similarities, it is easy to have trouble determining when to use which.

Das Überwachen von Ereignissen ist optionalListening to Events is Optional

Der wichtigste Aspekt bei der Bestimmung, welche Sprachfunktion verwendet werden soll, ist die Frage, ob ein angefügter Abonnent vorhanden sein muss.The most important consideration in determining which language feature to use is whether or not there must be an attached subscriber. Wenn der Code den Code vom Abonnenten aufrufen muss, sollten Sie einen Entwurf basierend auf den Delegaten verwenden.If your code must call the code supplied by the subscriber, you should use a design based on delegates. Wenn Ihr Code all seine Arbeit ohne Aufruf von Abonnenten abschließen kann, sollten Sie einen Entwurf auf Grundlage von Ereignissen verwenden.If your code can complete all its work without calling any subscribers, you should use a design based on events.

Betrachten Sie die Beispiele, die während dieses Abschnitts erstellt wurden.Consider the examples built during this section. Dem Code, den Sie mithilfe von List.Sort() erstellt haben, muss eine Vergleichsfunktion gegeben werden, um die Elemente ordnungsgemäß zu sortieren.The code you built using List.Sort() must be given a comparer function in order to properly sort the elements. LINQ-Abfragen müssen mit Delegaten bereitgestellt werden, um zu bestimmen, welche Elemente zurückgeben werden sollen.LINQ queries must be supplied with delegates in order to determine what elements to return. Beide verwenden einen mit Delegaten erstellten Entwurf.Both used a design built with delegates.

Betrachten Sie das Progress-Ereignis.Consider the Progress event. Es meldet den Status eines Tasks.It reports progress on a task. Der Task wird fortgesetzt, unabhängig davon, ob alle Listener vorhanden sind.The task continues to proceed whether or not there are any listeners. Der FileSearcher ist ein weiteres Beispiel.The FileSearcher is another example. Es würde weiterhin alle gesuchten Dateien suchen und finden, auch ohne angefügte Ereignisabonnenten.It would still search and find all the files that were sought, even with no event subscribers attached. UX-Steuerelemente funktionieren weiterhin ordnungsgemäß, auch wenn keine Abonnenten die Ereignisse überwachen.UX controls still work correctly, even when there are no subscribers listening to the events. Beide verwenden Entwürfe auf der Grundlage von Ereignissen.They both use designs based on events.

Rückgabewerte erfordern DelegatenReturn Values Require Delegates

Ein weiterer Aspekt ist der Methodenprototyp, den Sie für die Delegatmethode haben sollten.Another consideration is the method prototype you would want for your delegate method. Wie Sie gesehen haben, verfügen die für Ereignisse verwendete Delegaten alle über einen void-Rückgabetyp.As you've seen, the delegates used for events all have a void return type. Sie haben auch gesehen, dass Ausdrücke vorhanden sind, um Ereignishandler zu erstellen, die Informationen durch Ändern der Eigenschaften des Ereignisargumentobjekts zurück an die Ereignisquellen geben.You've also seen that there are idioms to create event handlers that do pass information back to event sources through modifying properties of the event argument object. Während diese Ausdrücke funktionieren, sind sie nicht so natürlich wie die Rückgabe eines Werts aus einer Methode.While these idioms do work, they are not as natural as returning a value from a method.

Beachten Sie, dass diese zwei Heuristiken häufig beide vorhanden sein können: Wenn Ihre Delegatmethode einen Wert zurückgibt, wird es sich wahrscheinlich in irgendeiner Form auf den Algorithmus auswirken.Notice that these two heuristics may often both be present: If your delegate method returns a value, it will likely impact the algorithm in some way.

Ereignislistener haben häufig eine längere LebensdauerEvent Listeners Often Have Longer Lifetimes

Dies ist eine etwas schwächere Begründung.This is a slightly weaker justification. Jedoch können Sie feststellen, dass ereignisbasierte Entwürfe natürlicher sind, wenn die Ereignisquelle über einen langen Zeitraum Ereignisse auslösen wird.However, you may find that event-based designs are more natural when the event source will be raising events over a long period of time. Sie können Beispiele dafür für UX-Steuerelemente auf vielen Systemen finden.You can see examples of this for UX controls on many systems. Sobald Sie ein Ereignis abonnieren, kann die Ereignisquelle Ereignisse während der gesamten Lebensdauer des Programms auslösen.Once you subscribe to an event, the event source may raise events throughout the lifetime of the program. (Sie können das Abonnement von Ereignissen kündigen, wenn Sie sie nicht mehr benötigen.)(You can unsubscribe from events when you no longer need them.)

Vergleichen Sie das mit vielen delegatbasierten Entwürfen, bei denen ein Delegat als Argument an eine Methode verwendet wird, und der Delegat wird nicht verwendet, nachdem diese Methode zurückgegeben wird.Contrast that with many delegate-based designs, where a delegate is used as an argument to a method, and the delegate is not used after that method returns.

Sorgfältig bewertenEvaluate Carefully

Die oben genannten Aspekte sind keine verbindlichen Regeln.The above considerations are not hard and fast rules. Stattdessen stellen sie Leitfäden dar, mit denen Sie entscheiden können, welche Auswahl für Ihre spezielle Verwendung am besten geeignet ist.Instead, they represent guidance that can help you decide which choice is best for your particular usage. Da sie sich ähneln, können Sie sogar beide als Prototyp nutzen, und überlegen, welche beim Arbeiten natürlicher wäre.Because they are similar, you can even prototype both, and consider which would be more natural to work with. Beide behandeln Szenarios mit später Bindung gut.They both handle late binding scenarios well. Verwenden Sie die, die Ihren Entwurf am besten kommuniziert.Use the one that communicates your design the best.