Entwickler-Ecke

Basistechnologien - Verständnisproblem event handler


funcry - Fr 20.03.09 16:26
Titel: Verständnisproblem event handler
Zwar setze ich events bereits ein, jedoch verstehe ich dabei eine Sache nicht.

Die Definition des Event handlers erfolgt in allen Beispielen ausserhalb der Klasse. So wie beispielsweise in diesem Tutorial:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
//declaring the event handler delegate
delegate void ButtonEventHandler(object source, int clickCount);

class Button
{
  //declaring the event
  public event ButtonEventHandler ButtonClick;

  //Function to trigger the event
  //This will be called when the user clicks the button
  public void clicked(int count)
  {
    //Invoking all the event handlers
    if (ButtonClick != null) ButtonClick (this,count);
  }
}


Ich habe testweise die Deklaration des Event handlers in die Klasse getan - und es funktioniert genauso.

Was mich stört ist, dass der Bereich ausserhalb der Klasse doch eigentlich zum aufrufenden Programm gehört und mit der Klasse "Button" nichts zu tun hat. Aber die Definition des Event handlers doch logisch betrachtet zu der Klasse "Button" gehört.

Was wäre, wenn ich aus der Klasse "Button" eine dll machen würde. Man könnte dann auf die klasse Button zugreifen, müsste aber die Event Handler selbst definieren ?


Kha - Fr 20.03.09 17:11

Eine gute Frage. Kurz gesagt: Öffentliche Nested Types (nichts anderes wäre der Delegate innerhalb der Klasse) sind in .NET einfach verpönt. Außerhalb deiner Klasse müsste man auf den Typ ja mit Button.ButtonEventHandler verweisen, und das scheint Einigen einfach zu lang/kompliziert/... zu sein ;) . Es besteht auch die Gefahr, diese Schreibweise mit einer Property "ButtonEventHandler" in der Button-Klasse zu verwechseln.
Also: Jeder Typ, der public ist, gehört per Konvention direkt in den namespace-Block.


user profile iconfuncry hat folgendes geschrieben Zum zitierten Posting springen:
Was wäre, wenn ich aus der Klasse "Button" eine dll machen würde.
Dann würdest du den Delegate-Typ natürlich ebenfalls da reinstopfen ;) . Und zwar als public, damit er genauso wie die Klasse von jedem benutzt werden kann. Das Typsystem der CLR erlaubt auch gar nicht, einen Delegate-Typ durch einen anderen auszutauschen - selbst, wenn sie die gleiche Signatur besitzen.

PS: Nicht direkt zu deiner Frage: Events sollten immer EventHandler<T> benutzen. Du brauchst also gar keinen eigenen Delegate-Typ, dafür aber einen EventArgs-Nachfahr.


funcry - Fr 20.03.09 20:49

Danke für die Erklärung, jetzt steht nichts mehr im Weg die Technik wie vorgesehen zu nutzen :-)