Hallo,
ich komme aus der Flash Welt und da sind einige Sachen einfacher. Ich habe in C# meine eigenen Events implementiert. Doch bisher muss ich fuer jedes Event eine eigene Arguments Klasse bilden und viele andere Sachen.
Das ich doch so komplex, ich weiss nur, dass ich in ActionScript das so mache:
(pseudo code)
meinObjekt.registriereListener(this);
this.onIrgendeinEvent = function () {
bla bla
}
Wieso ist so was in C# nicht moeglich?
Gruss,
Mirza
Hi!
Natürlich sind einfache Events auch in C# möglich:
class Test
{
public delegate void MeinEventHandler();
public event MeinEventHandler MeinEvent;
}
// ...
Test meineTestInstanz = new Test();
meineTestInstanz .MeinEvent += delegate
{
// Mach hier was
};
Allerdings ist das kein guter Stil! Daher ist diese Vorgehensweise auch nicht zu empfehlen.
Standardkonform wäre folgendes Szenario:
class Test
{
public delegate void MeinEventHandler([B]object sender, EventArgs e[/B]);
public event MeinEventHandler MeinEvent;
protected virtual OnMeinEvent(EventArgs e)
{
if (MeinEvent != null)
MeinEvent(this, e);
}
// Hier feuern
public void Test()
{
OnMeinEvent(EventArgs.Empty);
}
}
// ...
Test meineTestInstanz = new Test();
meineTestInstanz.MeinEvent += delegate(object sender, EventArgs e)
{
// Mach hier was
};
Falls Du dem Event Parameter mitgeben möchtest, leitest Du einfach eine Klasse von EventArgs ab. Diese Klasse hält dann alle Informationen des Events.
Damit ist das Event leicht erweiterbar bezüglich zusätzlicher Informationen.
Eine einfache EventArgs-Klasse könnte z.B. so aussehen:
class MeineEventArgs : EventArgs
{
private readonly int _dieID = 0;
public MeineEventArgs(int id)
: base()
{
_dieID = id;
}
public int ID
{
get { return _dieID; }
}
}
Mfg NeuroCoder
Hallo mirzahat,
du musst ja nicht jedesmal eine neue Arg-Klasse machen. Viele, wenn nicht die meisten Events von .NET haben keine eigenen Argumente, sondern nur EventArgs.Empty.
Aber selbst wenn man eigene Argumente übergeben will, dann braucht man nicht für jeden Event eine neue EventArgs-Klasse. In .NET gibt es mehr als ein Event, das KeyEventArgs bekommt und mehr als ein Event, das MouseEventArgs bekommt und mehr als ein Event, das CancelEventArgs bekommt usw.
herbivore
Aber selbst wenn man eigene Argumente übergeben will, dann braucht man nicht für jeden Event eine neue EventArgs-Klasse
ja, aber wie mache ich das? sagen wir mal ich habe 2 klassen die events senden, beide mit speziellen Params...wie mache ich das jetzt, 2 EventArgs Subklassen zu vermeiden?
gruss,
mirza
Was herbivore meint, ist, dass du erstmal nach vorhandenen EventArgs-Klassen benutzen, und wenn du Ereignisdatenklassen von EventArgs ableitest, dann kannst du immer auch Generika verwenden, mindestens beim Delegate (EventHandler<T>)
Im Gegensatz zur Flash ist .NET stark getypt. Daher die Notwendigkeit alle Event-Signaturen explizit zu definieren.
Hallo mirzahat,
ja, aber wie mache ich das? sagen wir mal ich habe 2 klassen die events senden, beide mit speziellen Params...wie mache ich das jetzt, 2 EventArgs Subklassen zu vermeiden?
wenn du verschiedene Klassen brauchst, brauchst du verschiedene Klassen. Ich habe ja nur geschrieben, dass man eben nicht immer verschiedene Klassen braucht.
herbivore