Autor Beitrag
funcry
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Fr 20.03.09 16:26 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Fr 20.03.09 20:49 
Danke für die Erklärung, jetzt steht nichts mehr im Weg die Technik wie vorgesehen zu nutzen :-)