Heim  >  Artikel  >  Backend-Entwicklung  >  C#-Wissensüberprüfung – Erste Schritte mit Ereignissen

C#-Wissensüberprüfung – Erste Schritte mit Ereignissen

高洛峰
高洛峰Original
2016-11-14 13:28:211279Durchsuche

1. Was ist ein Ereignis?

Eine Klasse oder ein Objekt kann andere Klassen oder Objekte über verwandte Ereignisse benachrichtigen, die durch Ereignisse aufgetreten sind. Die Klasse, die ein Ereignis sendet (oder auslöst), wird als „Herausgeber“ bezeichnet, und die Klasse, die ein Ereignis empfängt (oder verarbeitet), wird als „Abonnent“ (Abonnent) bezeichnet.

In einer typischen C#-Windows Forms- oder Webanwendung können Sie Ereignisse abonnieren, die von Steuerelementen wie Schaltflächen und Listenfeldern ausgelöst werden. Sie können eine integrierte Entwicklungsumgebung (IDE) verwenden, um die von einem Steuerelement veröffentlichten Ereignisse zu durchsuchen und die Ereignisse auszuwählen, die Sie verarbeiten möchten. Die IDE fügt automatisch eine leere Event-Handler-Methode und den Code zum Abonnieren des Ereignisses hinzu.

2. Zusammenfassung der Ereignisattribute

Der Aussteller bestimmt, wann das Ereignis ausgelöst wird; der Abonnent bestimmt die Reaktion auf das Ereignis.

Eine Veranstaltung kann mehrere Abonnenten haben. Abonnenten können mehrere Ereignisse von mehreren Herausgebern verwalten.

Ereignisse ohne Abonnenten werden niemals ausgelöst.

Ereignisse werden in der Regel zur Darstellung von Benutzeraktionen verwendet, beispielsweise dem Klicken einer Schaltfläche oder einer Menüoption in einer grafischen Benutzeroberfläche.

Wenn ein Ereignis mehrere Abonnenten hat, wird der Ereignishandler standardmäßig synchron aufgerufen, wenn das Ereignis ausgelöst wird.

Ereignisse basieren auf dem EventHandler-Delegaten und der EventArgs-Basisklasse.

3. Abonnement und Stornierung von Ereignissen

Wenn Sie benutzerdefinierten Code schreiben möchten, der aufgerufen wird, wenn ein Ereignis ausgelöst wird, können Sie von anderen Klassen veröffentlichte Ereignisse abonnieren. Sie können beispielsweise das Klickereignis einer Schaltfläche abonnieren, damit Ihre Anwendung eine nützliche Aktion ausführt, wenn der Benutzer auf die Schaltfläche klickt.

 1. Verwenden Sie die IDE, um Ereignisse zu abonnieren

C#-Wissensüberprüfung – Erste Schritte mit Ereignissen

Abbildung 3-1-1 Erstellen Sie ein neues WinForm-Projekt

C#-Wissensüberprüfung – Erste Schritte mit Ereignissen

Abbildung 3-1-2 Code wird beim Doppelklick auf Abbildung 1 automatisch erstellt

C#-Wissensüberprüfung – Erste Schritte mit Ereignissen

Abbildung 3-1-3 Zusätzlich zu Abbildung 2 die InitializeComponent-Methode wird auch automatisch hinzugefügt Diese Codezeile

2. Ereignisse programmgesteuert abonnieren

Vorausgesetzt, es handelt sich um ein neues WinForm-Programm, erstellen wir Ereignisse selbst manuell. Geben Sie this.Load = unter der InitializeComponent-Methode ein, und dann erscheint eine Eingabeaufforderung. Zu diesem Zeitpunkt drücken wir die „Tab-Taste“,

C#-Wissensüberprüfung – Erste Schritte mit Ereignissen

Abbildung 3-2-1

Sie werden feststellen, dass der Ereignishandler automatisch erstellt wird. Der Effekt stimmt mit dem Code überein, der durch Doppelklicken auf die Leerstelle im vorherigen Abschnitt erstellt wurde lautet wie folgt:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.Load += Form1_Load;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }
    }

Dieses Mal verwenden wir direkt die Lambda-Methode, um die Ereignisregistrierung abzuschließen: Klicken Sie auf die leere Stelle, um die Koordinaten des Mausklicks anzuzeigen.

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //this.Load += Form1_Load;

            //点击事件(lambda 方式创建)
            this.Click += (s, e) =>
            {
                MessageBox.Show($"{((MouseEventArgs)e).Location}");
            };
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }
    }

[Bemerkungen] Der Inhalt beinhaltet die Syntax von $: (C# 6), die nur von vs2015 und höher unterstützt wird. $"{msg}" entspricht string.Format("{0}", msg), msg bezieht sich auf eine Variable.

C#-Wissensüberprüfung – Erste Schritte mit Ereignissen

3. Verwenden Sie anonyme Methoden, um Ereignisse zu abonnieren

public Form1()
        {
            InitializeComponent();

            //this.Load += Form1_Load;

            //点击事件(lambda 方式创建)
            //this.Click += (s, e) =>
            //{
            //    MessageBox.Show($"{((MouseEventArgs)e).Location}");
            //};

            //使用匿名方法创建事件
            this.Click += delegate (object sender, EventArgs e)
            {
                var mouseEventArgs = (MouseEventArgs)e;
                var mouseLocation = mouseEventArgs.Location;

                MessageBox.Show($"X: {mouseLocation.X}, Y: {mouseLocation.Y}");
            };
        }

[Hinweis] Wenn Sie anonyme Funktionen zum Abonnieren verwenden Veranstaltungen wird die Veranstaltung abgesagt. Der Anmeldevorgang wird umständlich sein. Um sich in diesem Fall abzumelden, müssen Sie zum Abonnementcode des Ereignisses zurückkehren, die anonyme Methode in einer Delegatenvariablen speichern und dann den Delegaten zum Ereignis hinzufügen. Wenn Sie sich im Code Behind von einem Ereignis abmelden müssen, wird im Allgemeinen empfohlen, keine anonyme Funktion zum Abonnieren des Ereignisses zu verwenden.

4. Abmelden

Um zu verhindern, dass der Event-Handler aufgerufen wird, wenn ein Ereignis ausgelöst wird, melden Sie sich vom Ereignis ab. Um Ressourcenlecks zu verhindern, melden Sie sich von Ereignissen ab, bevor Sie das Abonnentenobjekt freigeben. Vor der Abmeldung von einem Ereignis verweist der Multicast-Delegat im Veröffentlichungsobjekt, das dem Ereignis zugrunde liegt, auf den Delegaten, der den Ereignishandler des Abonnenten kapselt. Solange das Veröffentlichungsobjekt diese Referenz enthält, wird das Abonnentenobjekt nicht durch die Garbage Collection gelöscht. Verwenden Sie den subtraktiven Zuweisungsoperator (-=), um sich von einem Ereignis abzumelden.

This.Load -= Form1_Load; //Verwenden Sie den Subtraktionszuweisungsoperator (-=), um sich vom Ereignis abzumelden

[Bemerkungen] Nachdem sich alle Abonnenten vom Ereignis abgemeldet haben, wird die Herausgeberklasse Die Ereignisinstanz in wird auf null gesetzt.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn