Események kezelése és emelése

A .NET-események a delegált modellen alapulnak. A delegált modell a megfigyelői tervezési mintát követi, amely lehetővé teszi az előfizető számára, hogy regisztráljon egy szolgáltatónál, és értesítéseket kapjon. Az esemény feladója leküld egy értesítést arról, hogy egy esemény történt, és az esemény fogadója megkapja az értesítést, és választ ad rá. Ez a cikk a delegált modell fő összetevőit, az alkalmazások eseményeinek használatát és az események kódban való megvalósítását ismerteti.

esemény

Az esemény egy objektum által küldött üzenet, amely egy művelet előfordulását jelzi. A műveletet okozhatja felhasználói beavatkozás, például gombkattintás, vagy más programlogika, például egy tulajdonság értékének módosítása. Az eseményt hívó objektum neve eseményküldő. Az esemény feladója nem tudja, hogy melyik objektum vagy metódus fogadja (kezeli) az általa kiváltott eseményeket. Az esemény általában az esemény feladójának tagja; Az esemény például Click az Button osztály tagja, az PropertyChanged esemény pedig annak az osztálynak a tagja, amely megvalósítja az interfészt INotifyPropertyChanged .

Esemény definiálásához használja a C# event vagy a Visual Basic Event kulcsszót az eseményosztály aláírásában, és adja meg az esemény delegáltjának típusát. A meghatalmazottakról a következő szakaszban olvashat.

Általában egy esemény létrehozásához olyan metódust kell hozzáadnia, amely (C#-ban) vagy OverridableProtected (Visual Basic) jelöléssel protectedvirtual rendelkezik. Nevezze el ezt a metódust OnEventName néven, OnDataReceivedpéldául. A metódusnak egy olyan paramétert kell használnia, amely egy eseményadat-objektumot határoz meg, amely egy típusú EventArgs vagy származtatott típusú objektum. Ezzel a módszerrel engedélyezheti, hogy származtatott osztályok felülbírálhassák az eseményt növelő logikát. A származtatott osztálynak mindig meg kell hívnia az On alaposztály EventName metódusát, hogy a regisztrált meghatalmazottak megkapják az eseményt.

Az alábbi példa bemutatja, hogyan deklarálhat egy eseményt .ThresholdReached Az esemény a EventHandler delegálthoz van társítva, és egy .OnThresholdReached

class Counter
{
    public event EventHandler ThresholdReached;

    protected virtual void OnThresholdReached(EventArgs e)
    {
        EventHandler handler = ThresholdReached;
        handler?.Invoke(this, e);
    }

    // provide remaining implementation for the class
}
Public Class Counter
    Public Event ThresholdReached As EventHandler

    Protected Overridable Sub OnThresholdReached(e As EventArgs)
        RaiseEvent ThresholdReached(Me, e)
    End Sub

    ' provide remaining implementation for the class
End Class

Delegáltak

A meghatalmazott olyan típus, amely egy metódusra mutató hivatkozást tartalmaz. A meghatalmazott aláírással van deklarálva, amely megjeleníti a hivatkozott metódusok visszatérési típusát és paramétereit, és csak az aláírásának megfelelő metódusokra hivatkozhat. A delegált így egyenértékű egy típusbiztos függvénymutatóval vagy visszahívással. A deklaráció elegendő a delegáltosztály meghatározásához.

A meghatalmazottaknak számos felhasználási módja van a .NET-ben. Az események kontextusában a meghatalmazott egy közvetítő (vagy mutatószerű mechanizmus) az eseményforrás és az eseményt kezelő kód között. Egy delegáltat úgy társíthat egy eseményhez, hogy az eseménydeklarációban szerepel a delegált típusa, ahogyan az előző szakaszban látható. A meghatalmazottakról további információt az Delegate osztályban talál.

A .NET biztosítja a EventHandler legtöbb eseményforgatókönyv támogatásához a meghatalmazottakat és EventHandler<TEventArgs> a meghatalmazottakat. Használja a EventHandler delegáltat minden olyan eseményhez, amely nem tartalmaz eseményadatokat. Használja a EventHandler<TEventArgs> delegáltat az eseményre vonatkozó adatokat tartalmazó eseményekhez. Ezek a meghatalmazottak nem rendelkeznek visszatérési típusértékkel, és két paramétert használnak (az esemény forrásának objektumát és az eseményadatok objektumát).

A meghatalmazottak csoportos küldésűek, ami azt jelenti, hogy több eseménykezelési módszerre is hivatkozhatnak. Részletekért tekintse meg a referenciaoldalt Delegate . A meghatalmazottak rugalmasságot és részletes vezérlést biztosítanak az eseménykezelésben. A meghatalmazott eseményközvetítőként szolgál az eseményt indító osztályhoz az eseményhez regisztrált eseménykezelők listájának fenntartásával.

Azokban az esetekben, amikor a meghatalmazottak és EventHandler<TEventArgs> a EventHandler meghatalmazottak nem működnek, megadhatja a meghatalmazottat. A meghatalmazott megadását igénylő forgatókönyvek nagyon ritkán fordulnak elő, például ha olyan kóddal kell dolgoznia, amely nem ismeri fel az általános kódot. Jelöljön meg egy meghatalmazottat a C# delegate és Visual Basic Delegate kulcsszóval a deklarációban. Az alábbi példa bemutatja, hogyan deklarálhat egy deklarált nevű ThresholdReachedEventHandlermeghatalmazottat.

public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e);
Public Delegate Sub ThresholdReachedEventHandler(sender As Object, e As ThresholdReachedEventArgs)

Eseményadatok

Az eseményhez társított adatok egy esemény adatosztályon keresztül adhatók meg. A .NET számos eseményadatosztályt biztosít, amelyeket az alkalmazásokban használhat. Az osztály például SerialDataReceivedEventArgs az esemény eseményadat-osztálya SerialPort.DataReceived . A .NET egy elnevezési mintát követ, amely az összes eseményadatosztályt a következővel végződteti EventArgs: . Az eseményhez társított esemény adatosztályának meghatározásához tekintse meg az esemény delegáltját. A delegált például SerialDataReceivedEventHandler az SerialDataReceivedEventArgs osztályt az egyik paramétereként tartalmazza.

Az EventArgs osztály az összes eseményadatosztály alaptípusa. EventArgs az is az osztály, amelyet akkor használ, ha egy eseményhez nincs adat társítva. Ha olyan eseményt hoz létre, amely csak arra szolgál, hogy értesítse a többi osztályt arról, hogy valami történt, és nem kell adatokat átadnia, adja meg az EventArgs osztályt második paraméterként a delegáltban. Az értéket átadhatja EventArgs.Empty , ha nincs megadva adat. A EventHandler meghatalmazott paraméterként tartalmazza az EventArgs osztályt.

Ha testre szabott eseményadatosztályt szeretne létrehozni, hozzon létre egy, az eseményhez EventArgskapcsolódó adatok átadásához szükséges tagokat tartalmazó osztályt. Általában ugyanazt az elnevezési mintát kell használnia, mint a .NET-nek, és az eseményadatosztály nevét a következővel kell végződnie EventArgs: .

Az alábbi példa egy eseményadat-osztályt mutat be ThresholdReachedEventArgs. Az eseményre jellemző tulajdonságokat tartalmaz.

public class ThresholdReachedEventArgs : EventArgs
{
    public int Threshold { get; set; }
    public DateTime TimeReached { get; set; }
}
Public Class ThresholdReachedEventArgs
    Inherits EventArgs

    Public Property Threshold As Integer
    Public Property TimeReached As DateTime
End Class

Eseménykezelők

Az eseményre való válaszadáshoz meg kell határoznia egy eseménykezelő metódust az esemény fogadójában. Ennek a metódusnak meg kell egyeznie a kezelt esemény meghatalmazottjának aláírásával. Az eseménykezelőben végrehajtja az esemény felmerülésekor szükséges műveleteket, például a felhasználói bevitel gyűjtését, miután a felhasználó egy gombra kattintott. Ahhoz, hogy értesítéseket kapjon az esemény bekövetkezésekor, az eseménykezelő metódusnak elő kell fizetnie az eseményre.

Az alábbi példa egy olyan eseménykezelő metódust c_ThresholdReached mutat be, amely megegyezik a meghatalmazott aláírásával EventHandler . A metódus feliratkozik az eseményre ThresholdReached .

class Program
{
    static void Main()
    {
        var c = new Counter();
        c.ThresholdReached += c_ThresholdReached;

        // provide remaining implementation for the class
    }

    static void c_ThresholdReached(object sender, EventArgs e)
    {
        Console.WriteLine("The threshold was reached.");
    }
}
Module Module1

    Sub Main()
        Dim c As New Counter()
        AddHandler c.ThresholdReached, AddressOf c_ThresholdReached

        ' provide remaining implementation for the class
    End Sub

    Sub c_ThresholdReached(sender As Object, e As EventArgs)
        Console.WriteLine("The threshold was reached.")
    End Sub
End Module

Statikus és dinamikus eseménykezelők

A .NET lehetővé teszi az előfizetők számára, hogy statikusan vagy dinamikusan regisztráljanak az eseményértesítésekre. A statikus eseménykezelők annak az osztálynak az egész életére érvényesek, amelynek eseményeit kezelik. A dinamikus eseménykezelők explicit módon aktiválódnak és inaktiválódnak a program végrehajtása során, általában valamilyen feltételes programlogikára reagálva. Például akkor használhatók, ha az eseményértesítésekre csak bizonyos feltételek mellett van szükség, vagy ha egy alkalmazás több eseménykezelőt is biztosít, és a futásidejű feltételek határozzák meg a megfelelőt. Az előző szakaszban látható példa bemutatja, hogyan adhat hozzá dinamikusan eseménykezelőt. További információt az Események (Visual Basic) és az Események (C#-ban) című témakörben talál.

Több esemény létrehozása

Ha az osztály több eseményt hoz létre, a fordító eseménydelegált példányonként egy mezőt hoz létre. Ha az események száma nagy, előfordulhat, hogy a delegáltak egy mezőjének tárolási költsége nem elfogadható. Ilyen helyzetekben a .NET olyan eseménytulajdonságokat biztosít, amelyeket egy másik, ön által választott adatstruktúrával használhat az eseménydelegáltak tárolásához.

Az eseménytulajdonságok eseménydeklarációkból állnak, amelyekhez eseménykiegészítők is tartoznak. Az eseménykiegészítők olyan metódusok, amelyekkel eseménydelegált példányokat adhat hozzá vagy távolíthat el a tárolási adatstruktúrából. Vegye figyelembe, hogy az eseménytulajdonságok lassabbak, mint az eseménymezők, mivel minden eseménydelegáltat le kell kérni, mielőtt meghívható lenne. A kompromisszum a memória és a sebesség között van. Ha az osztály számos ritkán emelt eseményt határoz meg, akkor érdemes eseménytulajdonságokat implementálnia. További információ : Több esemény kezelése eseménytulajdonságokkal.

Cím Leírás
Útmutató: Események létrehozása és felhasználása Példákat tartalmaz az események emelésére és felhasználására.
Útmutató: Több esemény kezelése eseménytulajdonságok használatával Bemutatja, hogyan használható az eseménytulajdonságok több esemény kezelésére.
Megfigyelői tervezési minta Ismerteti azt a tervezési mintát, amely lehetővé teszi az előfizető számára, hogy regisztráljon egy szolgáltatónál, és értesítéseket kapjon tőlük.

Lásd még