357 Stimmen

Das Verständnis von Ereignissen und Ereignishandlern in C#

Ich verstehe den Zweck von Ereignissen, insbesondere im Zusammenhang mit der Erstellung von Benutzeroberflächen. Ich denke, dies ist das Prototyp für die Erstellung eines Ereignisses:

public void EventName(object sender, EventArgs e);

Was machen Ereignishandler, warum werden sie benötigt und wie erstelle ich einen?

0voto

Valid Punkte 707

Ich bin einverstanden mit KE50, außer dass ich das Schlüsselwort 'event' als Alias für 'ActionCollection' betrachte, da das Ereignis eine Sammlung von Aktionen enthält, die ausgeführt werden sollen (d.h. der Delegierte).

using System;

namespace test{

class MyTestApp{
    //Die Ereignishandler-Deklaration
    public delegate void EventAction();

    //Die Ereignisaktionssammlung 
    //Äquivalent zu 
    //  public List EventActions=new List();
    //        
    public event EventAction EventActions;

    //Eine Aktion
    public void Hello(){
        Console.WriteLine("Hallo Welt der Ereignisse!");
    }
    //Eine weitere Aktion
    public void Goodbye(){
        Console.WriteLine("Auf Wiedersehen, grausame Welt der Ereignisse!");
    }

    public static void Main(){
        MyTestApp TestApp = new MyTestApp();

        //Aktionen zur Sammlung hinzufügen
        TestApp.EventActions += TestApp.Hello;
        TestApp.EventActions += TestApp.Goodbye;

        //Alle Ereignisaktionen aufrufen
        if (TestApp.EventActions!= null){
            //Diese eigenartige Syntax verbirgt den Aufruf 
            TestApp.EventActions();
            //unter Verwendung der Idee der 'ActionCollection':
            // foreach(EventAction action in TestApp.EventActions)
            //     action.Invoke();
        }
    }

}   

}

0voto

Siraf Punkte 657

Tolle technische Antworten im Beitrag! Ich habe technisch nichts hinzuzufügen.

Einer der Hauptgründe, warum neue Funktionen in Sprachen und Software im Allgemeinen erscheinen, ist Marketing oder Unternehmenspolitik! :-) Das darf nicht unterschätzt werden!

Ich denke, dass dies auch in gewissem Maße auf Delegaten und Ereignisse zutrifft! Ich finde sie nützlich und tragen zum Mehrwert der C#-Sprache bei, aber andererseits hat die Java-Sprache entschieden, sie nicht zu verwenden! Sie haben entschieden, dass das, was Sie mit Delegaten lösen, bereits mit den vorhandenen Funktionen der Sprache gelöst werden kann, z.B. Interfaces.

Um das Jahr 2001 herum veröffentlichte Microsoft das .NET-Framework und die C#-Sprache als konkurrierende Lösung zu Java, also war es gut, NEUE FUNKTIONEN zu haben, die Java nicht hat.

0voto

goor.auss Punkte 19

DELEGATES, EVENTS(EVENT HANDLERS/EVENT LISTENERS), KONZEPTE(MULTICASTING/BROADCASTING), AKTION & FUNC

Dies wird lang sein, aber es ist die einfachste Erklärung, das Problem dabei ist, dass es so ärgerlich ist, weil die Leute einfach unterschiedliche Wörter verwenden, um dasselbe zu erklären

Zunächst sollten Sie ein paar Dinge wissen

DELEGATES: Es ist einfach eine Liste von Methoden, warum eine Liste erstellen? Weil, wenn Ihr Code ausgeführt wird, wird diese Liste genommen und jede Methode darin wird nacheinander ausgeführt, hören Sie nicht einfach auf Textbuchdefinitionen, nehmen Sie dies und Sie werden alles richtig machen

auch genannt :

  • ein Zeiger auf eine Funktion
  • ein Wrapper für eine Methode, der Methoden senden und empfangen kann wie eine Variable

um einen Delegaten zu erstellen, gehen Sie

[[Zugriffsmodifizierer] delegieren [Rückgabetyp] [Delegatenname]([Parameter])]

Beispiel: public delegate int demo(int a);

jetzt, um alle diese Methoden auszuführen, die in einer Liste namens Delegaten gespeichert sind, gehen Sie

1. demo aufrufen(a);
2. demo(a);   ..... beides ist gültig

Die Verwendung des Punktes und das explizite Angeben von invoke kommt in der asynchronen Programmierung zum Einsatz, wenn Sie beginInvoke verwenden, aber das ist nicht Teil dieses Themas

es gibt noch eine weitere Sache namens "Erstellen eines Objekts des Delegaten/Instanziierung des Delegaten", was im Grunde genommen ist, wie es klingt, aber nur um Verwirrung zu vermeiden, geht es wie folgt (für das obige Beispiel )

Beispiel: demo del = new demo(); (oder) Public demo del = null;

um einer Liste namens Delegaten eine Methode hinzuzufügen, gehen Sie += und Sie müssen sie auch entfernen, sobald die "Anforderungen der Methoden erfüllt sind", gehen Sie -=

("Anforderungen der Methoden erfüllt sind" bedeutet, dass Sie die Methode nicht mehr aktiv benötigen oder auch "nachhören") Wenn Sie sie nicht entfernen, könnte dies zu einem "Speicherleck" führen, was bedeutet, dass der RAM Ihres Computers aufgefressen wird, technisch gesehen wird der zugewiesene Speicher nicht freigegeben

Beispiel: sagen wir, es gibt eine Methode

public int berechnen (int c)

um diese Methode zum Delegaten hinzuzufügen, gehen Sie

1.  del = berechnen;
2.  del += berechnen; .... alle sind gültig

zum Entfernen

del -= berechnen

zunächst einmal beachten Sie die Ähnlichkeiten zwischen dem Delegaten und der Methode, der Rückgabetyp (Output) und die Eingangs-/Parameter sind gleich, und das ist eine Regel, Sie können nicht einfach irgendwelche zufälligen oder Haufen von Methoden in einem Delegaten hinzufügen, es muss die Ein-Aus-Regel befolgen

jetzt warum gibt es 2 verschiedene Arten, eine Sache zu tun, der einzige Unterschied sind die Zuweisungsoperatoren (+, =), das führt zu einem neuen Thema namens

EVENTS

was nichts anderes als eine eingeschränkte Version eines Delegaten ist, es ist immer noch eine Liste von Methoden, lassen Sie sich nicht verwirren, wenn die Leute diese Terminologien erklären, sie ändern den Namen, also bleiben Sie bei dieser Erklärung, um es zu verstehen

was ist die Einschränkung? Sie können dies nicht tun del = berechnen; was ist daran schlimm, sagen wir, eine Reihe von Methoden wird dem Delegaten (Liste) hinzugefügt, wenn Sie das tun, werden alle gelöscht und es bleibt nur eine einzige Methode "berechnen" übrig, um das zu verhindern, werden Events verwendet, Event-Syntax

Public Event demo del = null;

Noch eine Sache, die Sie mit Events nicht tun können, ist den Delegaten direkt wie demo.invoke aufzurufen, da er öffentlich ist, kann er zugegriffen und aufgerufen werden, aber bei Events geht das nicht

jetzt fügen Sie einfach die Methoden zum Event hinzu (einem speziellen Typ des Delegaten)

wann Sie ein Event vs. einen Delegaten verwenden, hängt von Ihrer Situation ab, aber pragmatisch gesehen sind Events beliebt

ein paar weitere Schlüsselwörter

MULTICASTING: nichts anderes als das Hinzufügen von mehr als einer Methode zu einem Delegaten BROADCASTING: Hinzufügen von mehr als einer Methode zu einem Event

PUBLISHER: derjenige, der die Methode ausführt (ein Begriff, der bei der Übertragung verwendet wird), nur eine einzelne Einheit ABONNENT: Die Methoden, die ausgeführt werden, können mehrere sein

LÖSCHER: dasselbe wie ein Abonnent, aber der Begriff wird beim Multicasting verwendet

EVENT HANDLER: dasselbe wie ein Abonnent/Eventlistener, also wo liegt der Unterschied? im Grunde genommen ist es dasselbe, einige sagen, ein Ereignislistener erkennt, wann das Ereignis eintritt, und der Ereignisbehandler "bearbeitet" oder führt den Code aus, ES IST IM PRAKTIKUM DAS GLEICHE!

Aktion und Funktion sind einfach Delegaten, die erstellt und instanziiert wurden, also 2 Zeilen Code in einem Wort, der Unterschied liegt nur in den Rückgabetypen

AKTION: gibt nichts zurück, nimmt jedoch 0 oder mehr als 1 Eingabe entgegen

FUNK: gibt etwas zurück und nimmt Parameter an

wenn Sie nicht gut im Lesen sind, hier ist das beste Video zu diesem Thema

https://www.youtube.com/playlist?list=PLFt_AvWsXl0dliMtpZC8Qd_ru26785Ih_

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X