Ereignisse sind in C # ziemlich einfach, aber die MSDN-Dokumente machen sie meiner Meinung nach ziemlich verwirrend. Normalerweise wird in den meisten Dokumentationen erläutert, wie eine Klasse von der EventArgs
Basisklasse geerbt wird, und dafür gibt es einen Grund . Es ist jedoch nicht der einfachste Weg, Events zu machen, und für jemanden, der schnell und einfach etwas möchte, und in einer Zeitkrise ist die Verwendung des Action
Typs Ihr Ticket.
Ereignisse erstellen und abonnieren
1. Erstellen Sie Ihre Veranstaltung direkt nach Ihrer class
Erklärung in Ihrer Klasse .
public event Action<string,string,string,string>MyEvent;
2. Erstellen Sie Ihre Event-Handler-Klassenmethode in Ihrer Klasse.
private void MyEventHandler(string s1,string s2,string s3,string s4)
{
Console.WriteLine("{0} {1} {2} {3}",s1,s2,s3,s4);
}
3. Wenn Ihre Klasse aufgerufen wird, weisen Sie sie an, das Ereignis mit Ihrem neuen Ereignishandler zu verbinden. Der Grund, warum der +=
Operator verwendet wird, liegt darin, dass Sie Ihren speziellen Ereignishandler an das Ereignis anhängen. Sie können dies tatsächlich mit mehreren separaten Ereignishandlern tun. Wenn ein Ereignis ausgelöst wird, wird jeder Ereignishandler in der Reihenfolge ausgeführt, in der Sie sie hinzugefügt haben.
class Example
{
public Example()
{
MyEvent += new Action<string,string,string,string>(MyEventHandler);
}
}
4. Wenn Sie bereit sind, lösen Sie das Ereignis irgendwo in Ihrem Klassencode wie folgt aus (auch bekannt als Raise):
MyEvent("wow","this","is","cool");
Das Endergebnis, wenn Sie dies ausführen, ist, dass die Konsole "Wow, das ist cool" ausgibt. Wenn Sie "cool" mit einem Datum oder einer Sequenz geändert und diesen Ereignisauslöser mehrmals ausgeführt haben, wird das Ergebnis in einer FIFO-Sequenz angezeigt, wie Ereignisse normalerweise funktionieren sollten.
In diesem Beispiel habe ich 4 Zeichenfolgen übergeben. Sie können diese jedoch in einen akzeptablen Typ ändern oder mehr oder weniger Typen verwenden oder sogar das <...>
Out entfernen und nichts an Ihren Event-Handler übergeben.
Wenn Sie mehrere benutzerdefinierte Ereignishandler hätten und diese alle mit dem +=
Operator für Ihr Ereignis abonniert hätten, hätte Ihr Ereignisauslöser sie alle nacheinander aufgerufen.
Ereignisanrufer identifizieren
Was aber, wenn Sie den Anrufer für dieses Ereignis in Ihrem Ereignishandler identifizieren möchten? Dies ist nützlich, wenn Sie einen Ereignishandler wünschen, der mit Bedingungen reagiert, die darauf basieren, wer das Ereignis ausgelöst / ausgelöst hat. Es gibt einige Möglichkeiten, dies zu tun. Nachfolgend finden Sie Beispiele, die in der Reihenfolge ihrer Schnelligkeit angezeigt werden:
Option 1. (Schnellste) Wenn Sie es bereits kennen, übergeben Sie den Namen als Literalzeichenfolge an den Ereignishandler, wenn Sie ihn auslösen.
Option 2. (etwas schnell) Fügen Sie dies Ihrer Klasse hinzu und rufen Sie es über die aufrufende Methode auf. Übergeben Sie diese Zeichenfolge dann an den Ereignishandler, wenn Sie sie auslösen:
private static string GetCaller([System.Runtime.CompilerServices.CallerMemberName] string s = null) => s;
Option 3. (Am wenigsten schnell, aber immer noch schnell) Rufen Sie in Ihrem Ereignishandler beim Auslösen die Zeichenfolge für den Namen der aufrufenden Methode folgendermaßen ab:
string callingMethod = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().ReflectedType.Name.Split('<', '>')[1];
Abmelden von Ereignissen
Möglicherweise haben Sie ein Szenario, in dem Ihr benutzerdefiniertes Ereignis mehrere Ereignishandler enthält, Sie möchten jedoch einen speziellen aus der Liste der Ereignishandler entfernen. Verwenden Sie dazu den -=
Operator wie folgt:
MyEvent -= MyEventHandler;
Ein Wort der kleinen Vorsicht. Wenn Sie dieses und jenes Ereignis ausführen und keine Ereignishandler mehr haben und dieses Ereignis erneut auslösen, wird eine Ausnahme ausgelöst. (Ausnahmen können Sie natürlich mit Try / Catch-Blöcken abfangen.)
Alle Ereignisse löschen
Okay, nehmen wir an, Sie sind mit Ereignissen fertig und möchten nicht mehr verarbeiten. Setzen Sie es einfach wie folgt auf null:
MyEvent = null;
Die gleiche Vorsicht gilt auch für das Abbestellen von Ereignissen. Wenn Ihr benutzerdefinierter Ereignishandler keine Ereignisse mehr enthält und Sie ihn erneut auslösen, löst Ihr Programm eine Ausnahme aus.