| 

.NET C# Java Javascript Exception

1
Ich wundere mich gerade über die möglichen Schreibweisen beim registrieren bzw. deregistrieren von Eventhandlern:

// Beide Schreibweisen ...
m_Zaehler.ZaehlEvent += new EventHandler<EventArgs>(m_Zaehler_ZaehlEvent);
m_Zaehler.ZaehlEvent -= new EventHandler<EventArgs>(m_Zaehler_ZaehlEvent);

// ... funktionieren!?
m_Zaehler.ZaehlEvent += m_Zaehler_ZaehlEvent;
m_Zaehler.ZaehlEvent -= m_Zaehler_ZaehlEvent;


Die zweite Variante (ohne das new) finde ich persönlich "besser lesbar". Wobei die Schreibweise mit "new" vom Visual Studio quasi durch die Autovervollständigung vorgelebt wird. Bei dem "new" habe ich zuerst auch immer gedacht, ich erzeuge da irgendwie jedesmal eine "neue Instanz".

In diesem Beitrag bei mycsharp.de habe ich wenigstens schon mal den Hinweis auf .NET 1.1 (mit new) und .NET 2 (ohne new) gefunden. In der C# 4.0 Sprachreferenz steht:
Wie bei allen anderen impliziten und expliziten Konvertierungen kann mithilfe des Umwandlungsoperators explizit eine Konvertierung von Methodengruppen ausgeführt werden. Das Beispiel
object obj = new EventHandler(myDialog.OkClick);
kann daher auch wie folgt geschrieben werden:
object obj = (EventHandler)myDialog.OkClick;


Wie handhabt Ihr das? Gibt es Vor- bzw. Nachteile?

Danke,
Mike
01.09.2011
Xantiva 2,3k 2 9
2 Antworten
2
Wenn es schnell gehen muss, akzeptiere ich die von der Autovervollständigung erzeugte Syntax. Beim späteren Refaktorieren (die generierten Namen gefallen mir nur selten) streiche ich sie meist raus und verwende die Syntax mit dem reinen Methodennamen.

Ausschlaggebend ist für mich die bessere Lesbarkeit. Für die Variante mit new spricht hingegen, dass man daran leichter sieht, dass hier wirklich ein neues Objekt erzeugt wird. Es gibt Szenarien, in denen man das nicht vergessen sollte. (Konkret hatte ich mal den Fall, dass ich unmanaged code aufrufen mußte und der einen Callback haben wollte. Also einfach den Methodennamen als Parameter hingeschrieben, P/Invoke marshalled das ganz wunderbar, nur später gab es rätselhafte Speicherschutzverletzungen, weil der unmanaged code eben nicht eine Referenz auf meine Methode hielt, wie der Code suggerierte, sondern auf das implizit und on-the-fly erzeugte Delegate, das längst aus dem Scope war und nicht mehr existierte.)
01.09.2011
Matthias Hlawatsch 13,2k 4 9
Ich mache es genauso wie von Matthias im ersten Abschnitt beschrieben.
Tachyon 01.09.2011
0
Ich handhabe es auch wie Matthias, sofern ich denn überhaupt von Events Gebrauch mache. Da Events keine First-Class Objects sind, greife ich eher zum Observer-Pattern - gerade im Hinblick auf Freigabe der Handler ist mir ein IDisposable lieber als ein delegate.
Und mit den Reactive Extensions bekomme ich das (und noch viel mehr) mittlerweile geschenkt.
01.09.2011
ffordermaier 8,4k 3 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH