Laden...

C# Event Mechanismus macht mich fertig :-(

Erstellt von mirzahat vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.699 Views
M
mirzahat Themenstarter:in
102 Beiträge seit 2007
vor 16 Jahren
C# Event Mechanismus macht mich fertig :-(

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

N
335 Beiträge seit 2006
vor 16 Jahren

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

M
mirzahat Themenstarter:in
102 Beiträge seit 2007
vor 16 Jahren
:-)

danke, ich mache einfach einen Folder fuer die vielen Arg klassen 🙂

49.485 Beiträge seit 2005
vor 16 Jahren

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

M
mirzahat Themenstarter:in
102 Beiträge seit 2007
vor 16 Jahren
?

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

O
778 Beiträge seit 2007
vor 16 Jahren

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>)

S
8.746 Beiträge seit 2005
vor 16 Jahren

Im Gegensatz zur Flash ist .NET stark getypt. Daher die Notwendigkeit alle Event-Signaturen explizit zu definieren.

49.485 Beiträge seit 2005
vor 16 Jahren

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

M
mirzahat Themenstarter:in
102 Beiträge seit 2007
vor 16 Jahren

ok, vielen dank, ich komme schon zurecht irgendwie 🙂