Autor Beitrag
maxx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: So 24.01.10 11:15 
hello,

eine Frage zu events.

Hat man einen Button definiert und möchte man auf einen Click reagieren, braucht man:

this.button1.Click += new System.EventHandler(this.button1_Click);

this.button1.Click soll angeblich ein enum sein. Wenn ich aber versuche, selbst ein enum zu definieren und dem per += etwas hinzuzufügen, dann geht das nicht.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
      enum eX { A, B };
      public Form1()
      {
         InitializeComponent();
         eX += C;
      }


Was mache ich denn falsch?
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: So 24.01.10 11:25 
Click ist ein Event und kein Enum.

schau dir doch mal das Kapitel im OpenBook an 4.5 Ereignisse eines Objekts
maxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: So 24.01.10 12:50 
Hm ... warum man hier aber unbedingt ein += verwenden muss, verstehe ich aber leider immer noch nicht.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 24.01.10 13:21 
Weil du einem Event einen weiteren EventHandler hinzufügst. Ein Event ist ein MulticastDelegate heißt an dem kann mehr als einen EventHandler hängen. Der Syntax zum hinzufügen += und entfernen -= finde ich da doch recht logisch.
maxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: So 24.01.10 14:58 
Was steckt denn hinter diesem "Multicast-Delegate", woraufhin man etwas mittels += hinzufügen kann? Ein Array, Collection, ..??? Bei welchem Datentyp funktioniert denn dieses += ?

(P. S. mir ist klar, dass man mit += rechnen kann ... also z. B. i+=5)
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: So 24.01.10 15:46 
user profile iconmaxx hat folgendes geschrieben Zum zitierten Posting springen:
Was steckt denn hinter diesem "Multicast-Delegate", woraufhin man etwas mittels += hinzufügen kann? Ein Array, Collection, ..??? Bei welchem Datentyp funktioniert denn dieses += ?

(P. S. mir ist klar, dass man mit += rechnen kann ... also z. B. i+=5)



Und du hast das Kapitel aus dem genannten Linke gelesen? :gruebel:

_________________
Gruß
Christoph
maxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: So 24.01.10 18:48 
Zitat:
Und du hast das Kapitel aus dem genannten Linke gelesen?

Nicht alles Wort für Wort ... aber grundsätzlich schon.

Zitat:
Wir müssen per Anweisung den von uns bereitgestellten Handler an das Ereignis MeasureError des Objekts binden. Dazu übergeben wir dem Ereignis des Objekts mit dem »+=«-Operator eine Instanz des Delegates MeasureErrorEventHandler, wobei wir den Bezeichner des Handlers angeben:
ausblenden C#-Quelltext
1:
kreis.MeasureError += new MeasureErrorEventHandler(RadiusError);					

Auf diese Weise lassen sich auch mehrere Handler hintereinander angeben, die der Reihe nach ausgeführt werden, wenn das Ereignis MeasureError ausgelöst wird. Die einzige Bedingung ist, dass jeder Handler den vom Delegate festgelegten Kriterien hinsichtlich Parameterliste und Rückgabewert genügt.


Es geht um diesen Teil hier.
MouseError ist das Event, MeasureErrorEventHandler der Delegate.
Hier wird dem Event eine Instanz vom Delegate übergeben.

Aber was ist dieses Event für ein Datentyp, dass man hier mit += arbeiten kann? Was passiert bei diesem Event, sodass man hier einen Delegate nach dem anderen anhängen kann? Irgendwo müssen diese Delegate-Objekte ja gespeichert werden? In einem Array?? Aber bei Arrays kann man nicht mit += arbeiten.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 24.01.10 19:03 
user profile iconmaxx hat folgendes geschrieben Zum zitierten Posting springen:
Aber was ist dieses Event für ein Datentyp, dass man hier mit += arbeiten kann?
Naja, was sagt denn die Deklaration des Events? Genau, das ist wieder ein Delegate.
Es gibt keinen "Event"-Typ, jeder Delegate ist multicast-fähig.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
Action a = () => { Console.WriteLine("a"); };
Action b = () => { Console.WriteLine("b"); };

Action c = a + b;
c();

_________________
>λ=
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 24.01.10 19:47 
Zitat:
Bei welchem Datentyp funktioniert denn dieses += ?

Bei jeder Klasse die den + Operator überlädt oder bei der Compilermagie zieht.

Zitat:
Irgendwo müssen diese Delegate-Objekte ja gespeichert werden? In einem Array?? Aber bei Arrays kann man nicht mit += arbeiten.

Intern wird in einem MulticastDelegate wohl irgendeine Art von Delegatenliste verwaltet die vielleicht sogar ein Array ist. Das sollte dir aber egal sein da es die interna dieser Klasse sind. Vielleicht sind die Implementierungen in den verschiedenen Frameworkversionen eh soweit unterschiedlich das man da auch keine allgemeingültige Aussage treffen kann wie die die das macht.

Ein Multicastdelegate hat eine variable Länge ein Array ist aber fix. Ein Syntax zum hinzufügen würde meiner Meinung nach diese Eigenschaft verschleiern und die Leute würden sich wundern warum dieser theoretischen Array +=(oder +) Operators so langsam wäre. Man siehe dazu die Diskussionen warum ~addieren~ von Strings so langsam ist (ahnliches Problem) ;)
maxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70



BeitragVerfasst: So 24.01.10 20:52 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
Action a = () => { Console.WriteLine("a"); };
Action b = () => { Console.WriteLine("b"); };

Action c = a + b;
c();

Na bumm!! Was ist das??
Also folgendes ist mir klar:
Action ... Klasse
= ... Zuweisung
a ... Instanz von Action
{ ... } ... Bereich, in dem eine Ausgabe auf der Konsole erfolgt

Aber was bedeutet das hier:
() =>

Zitat:
Bei jeder Klasse die den + Operator überlädt

+ kann man anscheinend überladen, aber += anscheinend nicht.
msdn.microsoft.com/d...ms228498(VS.80).aspx

Zitat:
Compilermagie

Was ist das?