Gewusst wie: Abonnieren von Ereignissen und Kündigen von Ereignisabonnements (C#-Programmierhandbuch)How to: Subscribe to and Unsubscribe from Events (C# Programming Guide)

Wenn Sie benutzerdefinierten Code schreiben möchten, der aufgerufen wird, wenn dieses Ereignis ausgelöst wird, können Sie ein Ereignis abonnieren, das von einer anderen Klasse veröffentlicht wurde.You subscribe to an event that is published by another class when you want to write custom code that is called when that event is raised. Sie können z.B. das click-Ereignis einer Schaltfläche abonnieren, damit Ihre Anwendung etwas nützliches macht, wenn ein Benutzer auf die Schaltfläche klickt.For example, you might subscribe to a button's click event in order to make your application do something useful when the user clicks the button.

So abonnieren Sie Ereignisse mit der Visual Studio IDETo subscribe to events by using the Visual Studio IDE

  1. Wenn Sie in der Ansicht Entwurf das Fenster Eigenschaften nicht sehen können, klicken Sie mit der rechten Maustaste auf das Formular oder das Kontrollelement, für das Sie einen Ereignishandler erstellen möchten, und wählen Sie anschließen Eigenschaften aus.If you cannot see the Properties window, in Design view, right-click the form or control for which you want to create an event handler, and select Properties.

  2. Klicken Sie oben im Fenster Eigenschaften auf das Symbol Ereignisse.On top of the Properties window, click the Events icon.

  3. Doppelklicken Sie auf das Ereignis, das Sie erstellen möchten, z.B. das Load-Ereignis.Double-click the event that you want to create, for example the Load event.

    Visual C#Visual C# erstellt eine leere Ereignishandlermethode, und fügt diese in den Code ein. creates an empty event handler method and adds it to your code. Alternativ können Sie den Code auch manuell in der Codeansicht einfügen.Alternatively you can add the code manually in Code view. Die folgenden Codezeilen deklarieren beispielsweise eine Eventhandlermethode, die aufgerufen wird, wenn die Klasse Form das Load-Ereignis auslöst.For example, the following lines of code declare an event handler method that will be called when the Form class raises the Load event.

    private void Form1_Load(object sender, System.EventArgs e)
    {
        // Add your form load event handling code here.
    }
    

    Die Codezeile, die für das Abonnement des Ereignisses erforderlich ist, wird auch automatisch in der InitializeComponent-Methode in der Datei „Form1.Designer.cs“ in Ihrem Projekt generiert.The line of code that is required to subscribe to the event is also automatically generated in the InitializeComponent method in the Form1.Designer.cs file in your project. Sie sieht ungefähr so aus:It resembles this:

    this.Load += new System.EventHandler(this.Form1_Load);  
    

So abonnieren Sie Ereignisse programmgesteuertTo subscribe to events programmatically

  1. Definieren Sie eine Ereignishandlermethode, deren Signatur mit der Delegatsignatur des Ereignisses übereinstimmt.Define an event handler method whose signature matches the delegate signature for the event. Wenn das Ereignis z.B. auf dem Delegattyp EventHandler basiert, repräsentiert der folgende Code den Methodenstub:For example, if the event is based on the EventHandler delegate type, the following code represents the method stub:

    void HandleCustomEvent(object sender, CustomEventArgs a)  
    {  
       // Do something useful here.  
    }  
    
  2. Verwenden Sie den Additionszuweisungsoperator (+=), um ihren Ereignishandler Ihrem Ereignis anzufügen.Use the addition assignment operator (+=) to attach your event handler to the event. Gehen Sie in folgendem Beispiel davon aus, dass ein Objekt mit dem Namen publisher ein Ereignis mit dem Namen RaiseCustomEvent aufweist.In the following example, assume that an object named publisher has an event named RaiseCustomEvent. Beachten Sie, dass die Abonnementklasse einen Verweis auf die Herausgeberklasse benötigt, um deren Ereignis abonnieren zu können.Note that the subscriber class needs a reference to the publisher class in order to subscribe to its events.

    publisher.RaiseCustomEvent += HandleCustomEvent;  
    

    Beachten Sie, dass die oben stehende Syntax in C# 2.0 neu ist.Note that the previous syntax is new in C# 2.0. Sie entsprechen der Syntax in C# 1.0, in der der kapselnde Delegat mithilfe des Schlüsselwort new explizit erstellt werden muss:It is exactly equivalent to the C# 1.0 syntax in which the encapsulating delegate must be explicitly created by using the new keyword:

    publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);  
    

    Ein Ereignishandler kann auch mithilfe eines Lambdaausdruckes hinzugefügt werden:An event handler can also be added by using a lambda expression:

    public Form1()  
    {  
        InitializeComponent();  
        // Use a lambda expression to define an event handler.  
        this.Click += (s,e) => { MessageBox.Show(  
           ((MouseEventArgs)e).Location.ToString());};  
    }  
    

    Weitere Informationen finden Sie unter Vorgehensweise: Verwenden von Lambdaausdrücken außerhalb von LINQ.For more information, see How to: Use Lambda Expressions Outside LINQ.

So abonnieren Sie Ereignisse mit einer anonymen MethodeTo subscribe to events by using an anonymous method

  • Wenn Sie das Abonnement eines Ereignisses später nicht kündigen müssen, können Sie den Additionszuweisungsoperator (+=) verwenden, um eine anonyme Methode an das Ereignis anzufügen.If you will not have to unsubscribe to an event later, you can use the addition assignment operator (+=) to attach an anonymous method to the event. Gehen Sie in folgendem Beispiel davon aus, dass ein Objekt mit dem Namen publisher ein Ereignis mit dem Namen RaiseCustomEvent aufweist, und dass eine CustomEventArgs-Klasse so definiert wurde, dass Sie eine Art von spezialisierter Ereignisinformation enthält.In the following example, assume that an object named publisher has an event named RaiseCustomEvent and that a CustomEventArgs class has also been defined to carry some kind of specialized event information. Beachten Sie, dass die Abonnementklasse einen Verweis auf die publisher benötigt, um deren Ereignis abonnieren zu können.Note that the subscriber class needs a reference to publisher in order to subscribe to its events.

    publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e)  
    {  
      string s = o.ToString() + " " + e.ToString();  
      Console.WriteLine(s);  
    };  
    

    Nehmen Sie auch zur Kenntnis, dass Sie das Abonnement eines Ereignisses nicht ohne Weiteres kündigen können, wenn Sie eine anonyme Funktion für das Abonnement verwendet haben.It is important to notice that you cannot easily unsubscribe from an event if you used an anonymous function to subscribe to it. Um in einem derartigen Szenario das Abonnement kündigen zu können, müssen Sie zu dem Code zurückkehren, mit dem Sie das Ereignis abonniert haben; speichern Sie anschließend die anonyme Methode in einer Delegatvariablen, und fügen Sie dann den Delegaten in das Ereignis ein.To unsubscribe in this scenario, it is necessary to go back to the code where you subscribe to the event, store the anonymous method in a delegate variable, and then add the delegate to the event. Grundsätzlich wird empfohlen, keine anonymen Funktionen für das Abonnieren von Ereignissen zu verwenden, wenn Sie das Abonnement an einer späteren Stelle in Ihrem Code noch einmal kündigen müssen.In general, we recommend that you do not use anonymous functions to subscribe to events if you will have to unsubscribe from the event at some later point in your code. Informationen zu anonymen Funktionen finden Sie unter Anonyme Funktionen.For more information about anonymous functions, see Anonymous Functions.

Kündigen des AbonnementsUnsubscribing

Kündigen Sie das Ereignisabonnement, um ein Abrufen des Ereignishandlers beim Auslösen des Ereignisses zu verhindern.To prevent your event handler from being invoked when the event is raised, unsubscribe from the event. Sie sollten das Ereignisabonnement kündigen, bevor Sie ein Abonnentenobjekt verwerfen, um Ressourcenverluste zu verhindern.In order to prevent resource leaks, you should unsubscribe from events before you dispose of a subscriber object. Bis zur Kündigung Ihres Ereignisabonnements verweist der Multicastdelegat, der dem Ereignis im Veröffentlichungsobjekt zugrunde liegt, auf einen Delegaten, der den Ereignishandler des Abonnenten einkapselt.Until you unsubscribe from an event, the multicast delegate that underlies the event in the publishing object has a reference to the delegate that encapsulates the subscriber's event handler. Solange das Veröffentlichungsobjekt diesen Verweis enthält, wird Ihr Abonnentenobjekt bei der automatische Speicherbereinigung nicht gelöscht.As long as the publishing object holds that reference, garbage collection will not delete your subscriber object.

So kündigen Sie ein EreignisabonnementTo unsubscribe from an event

  • Verwenden Sie den Subtraktionszuweisungsoperator (-=), um ein Ereignisabonnement zu kündigen:Use the subtraction assignment operator (-=) to unsubscribe from an event:

    publisher.RaiseCustomEvent -= HandleCustomEvent;  
    

    Wenn alle Abonnenten ihr Ereignisabonnement gekündigt haben, wird die Ereignisinstanz in der Herausgeberklasse auf null festgelegt.When all subscribers have unsubscribed from an event, the event instance in the publisher class is set to null.

Siehe auchSee Also

EreignisseEvents
eventevent
Gewusst wie: Veröffentlichen von Ereignissen, die den .NET Framework-Richtlinien entsprechenHow to: Publish Events that Conform to .NET Framework Guidelines
-= Operator (C#-Referenz)-= Operator (C# Reference)
+=-Operator+= Operator