Hallo allerseits,
ich habe vor kurzem über die Benutzung von Action<T> Delegates anstelle von
Events gelesen:
Beispiel:
class Program
{
static void Main(string[] args)
{
Test MyTest = new Test();
MyTest.OnEvent = (i) =>
{
Console.WriteLine(">>"+i+"<<");
};
MyTest.Run();
Console.ReadKey();
}
}
class Test
{
public Action<int> OnEvent;
public void Run()
{
for (int i = 0; i < 20; i++)
{
if (i == 13)
{
OnEvent(i);
}
}
}
}
Welche Vorteile/Nachteile hat so ein Action<T> Delegate und kann man
ihn als Ersatz für normale Events benutzen?
Der 1. Vorteil der mit einfällt das man nichts abonnieren und abbestellen muss.(Wie bei Events)
Gruß
rubiktubik
Hallo,
Events sind auch nur Multicast Delegates.
Events haben Einschränkungen was den Zugriff von außerhalb angeht. Bei deiner einfachen Delegate Lösung kann jeder dir den Delegate von außen entfernen, dass geht bei Events nicht und ist auch gut so. Desweiteren sind Events Multicastdelegates, sprich man kann mehrere Eventhandler gleichzeitig ranhängen und nicht nur einen wie bei dir.
Der 1. Vorteil der mit einfällt das man nichts abonnieren und abbestellen muss. Muss man bei Events auch nicht wenn einen egal ist ob das Objekt vom GC abgeräumt werden kann oder nicht. Das trifft bei den einfachen Delegates ganz genauso zu. Auch dort muss man das Delegate auf Null setzten um die Referenz auf die Methode zu entfernen und dem GC ne Chance zu geben das Objekt freizugeben.
Baka wa shinanakya naoranai.
Mein XING Profil.
Desweiteren sind Events Multicastdelegates, sprich man kann mehrere Eventhandler gleichzeitig ranhängen und nicht nur einen wie bei dir.
Doch, "normale" Delegaten können auch als Multicast-Delegaten verwendet werden. Siehe auch Gewusst wie: Kombinieren von Delegaten (Multicastdelegaten)
[quote3=[Artikel] Delegaten, anonyme Methoden, Lambda-Ausdrücke & Co,http://www.mycsharp.de/wbb2/thread.php?threadid=74181]Ein spezieller Typ von Multicastdelegaten sind Ereignisse ("events"). Diese werden durch das event
-Schlüsselwort gekennzeichnet und können dann nur in der Klasse oder Struktur aufgerufen werden, in der sie auch deklariert wurden. Ereignishandler sind nichts weiter als Methoden, die dann durch den Delegaten aufgerufen werden. Das Abonnieren von Ereignissen mittels +=
bedeutet nichts weiter, als das eine (Ereignisbehandlungs-)Methode dem Multicastdelegaten hinzugefügt wird.[/quote3]
Hallo rubiktubik,
du solltest Events immer so definieren, wie in [FAQ] Eigenen Event definieren nach den Vorgaben von Microsoft empfohlen, also mit dem event-Schlüsselwort und mit Sender- und EventArgs-Parameter.
Die vordefinierten Delegaten-Typen Action<>, Predicate<>, Func<> usw. sind eher für Methodenparameter gedacht, z.B List<T>.ForEach(Action<T> action).
herbivore