2010-11-12 2 views
10

.NET 2.0 hinzugefügt den EventHandler<TArgs> generischen Delegattyp, um den Prozess des Schreibens benutzerdefinierter Ereignisse zu vereinfachen; Anstatt eine Klasse EventArgs und den entsprechenden Delegaten definieren zu müssen (z. B. MyEventArgs und MyEventHandler), müssen Sie nur die Klasse args schreiben.Warum wird der generische EventHandler <TArgs> so wenig genutzt?

Bedenkt man, warum dieser Delegate-Typ fast nirgends in dem .NET angezeigt wird? Ich weiß, dass die meisten Kern-APIs vor der Einführung von Generika entwickelt wurden, aber selbst in neuen Teilen des Frameworks wie WPF haben sie sich dafür entschieden, Delegattypen explizit zu definieren; z.B. RoutedEventHandler anstelle von EventHandler<RoutedEventArgs>.

Gibt es etwas inhärent falsch mit dem generischen Event-Handler-Delegat? Ich benutze es oft und ich mache mir Sorgen, dass mein Code im Vergleich zu integrierten Klassen sehr fehl am Platz erscheint.

+0

Ich vermute, die Einführung von 'EventHandler ' war nur schlechtes Timing. Zu der Zeit, als es eingeführt wurde, war das andere Muster (ausdrücklich Delegierte genannt) fest etabliert und eine Verschiebung in Richtung des generischen Delegattyps könnte als ein noch größeres Durcheinander angesehen worden sein (indem es zu verwirrten Programmierern führte, die fragten) "Was war das? Delegat erneut aufgerufen? 'FooEventHandler' oder' EventHandler '?" _) - Was mich neugierig macht, ob die Verschiebung in Richtung 'IEvent ' (eingeführt von F # und dem Rx-Framework) funktioniert. – stakx

+3

WPF wurde im Juli 2003 gestartet, lange bevor Generika verfügbar waren. Dasselbe gilt natürlich auch für Windows Forms. –

Antwort

7

Nur ein Unfall der Geschichte. Wenn wir Generics in .NET 1 hätten, wären die meisten anderen Delegierten nicht vorhanden.

5

Ich glaube nicht, dass irgendetwas daran falsch ist. Es ist in einigen Orten des Frameworks verwendet ... in der GeoCoordinateWatcher.Position Ereignis, nur als ein zufälliges Beispiel.

Es ist ein wenig schwerfälliger wie RoutedEventHandler in Code als einen bestimmten Typnamen zu sehen - und wie du gehst RoutedEventHandler eine Menge in WPF/Silverlight verwenden, vielleicht ist das, warum MS beschlossen, es seine eigene Art zu geben.

2

Es könnte auch sein, dass Sie beim Schreiben von Framework-Level-Code eher explizit sind. Wenn Sie Toolkit und Anwendungsebene Code nicht so schreiben.

1

Das Folgende ist nur meine persönliche Meinung, aber es scheint (offensichtlich) für mich vernünftig; Wenn wir uns genauer ansehen, wie Sie mit .net und v studio arbeiten, scheint es, als ob die generische Typnotation etwas "Schönheit" verliert.

List<string> lst = new List<string>(); 
lst.Add("hello world"); 

Während der Code oben ist ziemlich einfach, geradlinig und gut durch intelli Sinn des Eventhandler „Look and Feel“ muß nicht so klar erscheinen unterstützt. Die Standard-Intelli-Unterstützung schlägt nur den EventHandler vor, nicht seinen generischen. Weiterhin ist die Notation sieht einfach awfull:

private event EventHandler<MyClass> SomeEvent; 
private event EventHandler<AnotehrClass> OtherEvent; 
privete event EventHandler<MoreClass> MoreEvents; 



Während der Code überblickend werden Sie jedes Mal, und Ihre Gedanken lesen „Eventhandler“ könnte diese Delegierten verbinden, beacuse Sie die Beziehung von Typen durch ihre Namen werden verwendet, um zu identifizieren .

Auf der anderen Seite könnte es auch eine weniger isotechnische und technischere Erklärung geben:
Zunächst erhalten Sie immer ein Absenderobjekt in der Handling-Methode. Während dies auf den ersten Blick nützlich scheint - es ist Gerste jemals verwendet.
Weitere Argumente müssen von EventArgs abgeleitet werden, die aufgrund der Verwendung vorhandener Komponenten störend oder manchmal auch nur unveränderbar sind.
Anders als die typischen Generika (z. B. IList/List) Sie die Möglichkeit, einen abstrakteren Typ (wie eine Schnittstelle) oder nur einen einfachen Typ (wie ein Doppel) zu verwenden.
Zu guter Letzt gibt es noch die Notationsregeln/Vorschläge, die von Microsoft eingeführt wurden - für Ihr Beispiel zum gerouteten Ereignis würde die Regel sagen, dass ihr Typ "markiert" wurde, indem ihr Name mit dem Wort "Routed" angezeigt wurde. Während die Benennung für das Ereignis selbst sagt, dass der Name mit einer "Vorschau" beginnt.

Wie ich schon sagte: das ist nur meine Meinung, also beschuldige mich nicht;)

+0

Der 'sender' Parameter hat definitiv seine Verwendung. Es wird immer dann verwendet, wenn derselbe Handler an Ereignisse in mehreren Objekten gebunden ist. Obwohl es nicht immer nützlich ist, erwarten Leute, die Ihren Code verwenden, dass er verfügbar ist. Was die Verwendung von Nachkommen von 'EventArgs' betrifft, so denke ich persönlich, dass dies die Idee darstellt, ein Tor zwischen Ihrem Code und dem des Benutzers zu setzen - damit Sie nie versehentlich ein veränderbares Objekt erhalten, das Sie nicht ändern sollen usw. Ihre Anmerkungen zur Benennung sind jedoch definitiv gültig. Wünscht mir, dass C# 'typedef' hat ... –

Verwandte Themen