Freigeben über


Geeignetes Festlegen von Bereichen für Variablen in Ereignishandlern

Ein häufiger Fehler beim Programmieren von Ereignishandlern besteht darin, den Ereignishandler mit einem Objekt zu verbinden, das mit einem zu begrenzten Bereich für die Behandlung des Ereignisses deklariert wurde. Die Lebensdauer des Objekts muss sich nicht über nur die Funktion erstrecken, die die Rückrufmethode als Ereignishandler mit dem Objekt verbindet, sondern auch über die Rückrufmethode selbst, in der das Ereignis tatsächlich behandelt wird. Andernfalls wird die Rückrufmethode nicht aufgerufen und das Ereignis nicht wie gewünscht behandelt, wenn das Objekt außerhalb des gültigen Bereichs liegt und in der Rückrufmethode nicht mehr definiert ist.

Im folgenden Beispiel wird versucht, die MyNewInspector-Rückrufmethode mit dem NewInspector-Ereignis zu verbinden. Die Rückrufmethode ist in dem Codebeispiel jedoch mit dem NewInspector-Ereignis eines Inspectors-Objekts verankert, dessen Bereich auf die Connect-Funktion beschränkt ist. Wenn die Rückrufmethode schließlich aufgerufen wird, wurde die Connect-Funktion bereits beendet und das Inspectors-Objekt wurde bereits von der Garbagecollection erfasst; somit wird MyNewInspector nie aufgerufen.

using Outlook = Microsoft.Office.Interop.Outlook;

class MyClass
{
    private Outlook.Application MyApp;

    public MyClass(Outlook.Application appOutlook)
    {
        MyApp = appOutlook;
    }

    // Connects the NewInspector event to my callback method
    public void Connect()
    {
        MyApp.Inspectors.NewInspector += new Outlook.
            InspectorsEvents_NewInspectorEventHandler(
            MyNewInspector);
    }

    public void MyNewInspector(Outlook.Inspector inspector)
    {
        MessageBox.Show("
            My event handler caught a NewInspector event");
    }
}

In diesem Fall müssen Sie das Inspectors-Objekt in einer permanenteren Variable speichern, deren Lebensdauer sich über die gesamte MyClass erstreckt, einschließlich der MyNewInspector-Rückrufmethode. Im folgenden Beispiel verfügt MyInspectors über einen Bereich der gesamten MyClass und stellt sicher, dass die Rückrufmethode für die Lebensdauer der Klasse verbunden ist.

using Outlook = Microsoft.Office.Interop.Outlook;

class MyClass
{
    private Outlook.Application MyApp;
    private Outlook.Inspectors MyInspectors;

    public MyClass(Outlook.Application appOutlook)
    {
        MyApp = appOutlook;
    }

    // Connects the NewInspector event to my callback method
    public void Connect()
    {
        MyInspectors = MyApp.Inspectors;
        MyInspectors.NewInspector += new Outlook.
            InspectorsEvents_NewInspectorEventHandler(
            MyNewInspector);
    }

    public void MyNewInspector(Outlook.Inspector inspector)
    {
        MessageBox.Show("
            My event handler caught a NewInspector event");
    }
}

Aufgrund der syntaktischen Unterschiede bei der Verbindung von Ereignishandlern in verschiedenen Sprachen tritt das Problem in Sprachen wie Visual Basic, in denen Sie ein Ereignis durch Angeben einer Instanz des übergeordneten Objekts verbinden und gleichzeitig die Rückrufmethode definieren können, seltener auf. Im folgenden Beispiel in Visual Basic wird die Handles-Schlüsselwort (keyword) verwendet, um die Region_Expanded Rückrufmethode mit dem Expanded-Ereignis zu verbinden. Der Bereich einer Instanz des übergeordneten Objekts, Region, erstreckt sich über MyClass einschließlich der Region_Expanded-Rückrufmethode.

Imports Outlook = Microsoft.Office.Interop.Outlook

Public Class MyClass
    ' The Region object has a lifetime spanning the class 
    ' including the callback method Region_Expanded
    Private WithEvents Region As Outlook.FormRegion
    ...
    Private Sub Region_Expanded() Handles Region.Expanded
        MsgBox("My EventHandler caught an Expanded event.")
    End Sub
End Class

Da in diesem Beispiel die Region_Expanded Rückrufmethode für die Lebensdauer der Klasse mit dem Expanded-Ereignis verbunden ist, wird die Rückrufmethode entsprechend aufgerufen.

Siehe auch