Megosztás a következőn keresztül:


Bevezetés az eseményekbe

Előző

Az események, például a meghatalmazottak, egy késői kötési mechanizmus. Az események valójában a meghatalmazottak nyelvi támogatásán alapulnak.

Az események módot adnak arra, hogy egy objektum (a rendszer minden érdekelt összetevője számára) közvetítse, hogy valami történt. Bármely más összetevő előfizethet az eseményre, és értesítést kaphat az eseményről.

Valószínűleg eseményeket használt néhány programjában. Számos grafikus rendszer rendelkezik eseménymodellel a felhasználói interakciók jelentéséhez. Ezek az események az egér mozgását, a gombnyomásokat és hasonló interakciókat jelentik. Ez az egyik leggyakoribb forgatókönyv, de nem ez az egyetlen eset, amikor eseményeket használnak.

Meghatározhatja az osztályok számára előhozandó eseményeket. Az események használatakor fontos szempont, hogy egy adott eseményhez ne legyen regisztrálva objektum. Meg kell írnia a kódot, hogy ne okozz eseményeket, ha nincsenek konfigurálva figyelők.

Az eseményre való feliratkozás két objektum (az eseményforrás és az esemény fogadója) közötti kapcsolatot is létrehoz. Gondoskodnia kell arról, hogy az esemény fogadója leiratkozik az eseményforrásról, ha már nem érdeklik az események.

Az eseménytámogatás céljainak megtervezése

Az események nyelvi kialakítása a következő célokat célozza:

  • Nagyon minimális összekapcsolás engedélyezése egy eseményforrás és egy eseményfogyó között. Előfordulhat, hogy a két összetevőt nem ugyanaz a szervezet írja, és akár teljesen más ütemezés szerint is frissíthető.

  • Nagyon egyszerűnek kell lennie egy eseményre való feliratkozásnak, és le kell iratkoznia ugyanarról az eseményről.

  • Az eseményforrásoknak több esemény-előfizetőt kell támogatniuk. Azt is támogatnia kell, hogy ne legyenek esemény-előfizetők csatolva.

Láthatja, hogy az események céljai nagyon hasonlóak a meghatalmazottak céljaihoz. Ezért az esemény nyelvi támogatása a delegált nyelv támogatására épül.

Nyelvi támogatás eseményekhez

Az események definiálásának, valamint az eseményekről való feliratkozásnak vagy leiratkozásnak szintaxisa a meghatalmazottak szintaxisának kiterjesztése.

Egy esemény definiálásához használja a kulcsszót event :

public event EventHandler<FileListArgs> Progress;

Az esemény típusának (EventHandler<FileListArgs> ebben a példában) delegált típusnak kell lennie. Az esemény deklarálása során számos konvenciót kell követnie. Az eseménymeghatalmazás típusa általában érvénytelen visszatérési értéket tartalmaz. Az eseménydeklarációknak igének vagy igekifejezésnek kell lenniük. Használjon korábbi feszültet, amikor az esemény jelentést tesz valamiről, ami történt. Egy jelenlegi feszült igét (például) használva jelentsen valamit, Closingami történni fog. A jelenlegi tense használata gyakran azt jelzi, hogy az osztály támogat valamilyen testreszabási viselkedést. Az egyik leggyakoribb forgatókönyv a lemondás támogatása. Egy esemény tartalmazhat például egy argumentumot, Closing amely azt jelzi, hogy a záró műveletet folytatni kell-e, vagy sem. Más forgatókönyvek lehetővé tehetik a hívók számára, hogy módosítsák a viselkedést az eseményargumentumok tulajdonságainak frissítésével. Eseményt is beállíthat, amely azt jelzi, hogy az algoritmus egy következő javasolt műveletet fog elvégezni. Az eseménykezelő más műveletet is előírhat az eseményargumentum tulajdonságainak módosításával.

Ha növelni szeretné az eseményt, meghívja az eseménykezelőket a delegálási hívás szintaxisával:

Progress?.Invoke(this, new FileListArgs(file));

A meghatalmazottakról szóló szakaszban leírtak szerint a ?. az operátor megkönnyíti annak biztosítását, hogy ne kísérelje meg emelni az eseményt, ha nincs előfizetője az eseménynek.

Az operátorral előfizethet egy eseményre += :

EventHandler<FileListArgs> onProgress = (sender, eventArgs) =>
    Console.WriteLine(eventArgs.FoundFile);

fileLister.Progress += onProgress;

A kezelőmetódus általában a "Be" előtaggal rendelkezik, amelyet az esemény neve követ a fent látható módon.

Az operátor használatával -= leiratkozhat:

fileLister.Progress -= onProgress;

Fontos, hogy deklaráljon egy helyi változót az eseménykezelőt képviselő kifejezéshez. Ez biztosítja, hogy a leiratkozás eltávolítsa a kezelőt. Ha ehelyett a lambda kifejezés törzsét használta, egy soha nem csatolt kezelőt próbál eltávolítani, amely semmit sem tesz.

A következő cikkben többet is megtudhat a tipikus eseménymintákról és a példában szereplő különböző változatokról.

Következő