Laden...

Unterschied zwischen Action<T> Delegat und Events

Erstellt von rubiktubik vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.172 Views
R
rubiktubik Themenstarter:in
4 Beiträge seit 2012
vor 12 Jahren
Unterschied zwischen Action<T> Delegat und Events

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

6.862 Beiträge seit 2003
vor 12 Jahren

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.

2.891 Beiträge seit 2004
vor 12 Jahren

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]

49.485 Beiträge seit 2005
vor 12 Jahren

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

R
rubiktubik Themenstarter:in
4 Beiträge seit 2012
vor 12 Jahren

👍

Achso danke für die nützlichen Antworten!

Gruß
rubiktubik