Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az események a meghatalmazottakhoz hasonlóan 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 egérmozgatást, gombnyomást és hasonló interakciókat jelentenek. Ez az egyik leggyakoribb, de nem az egyetlen eset, amikor eseményeket használnak.
Meghatározhatja az osztályok számára előhozandó eseményeket. Az eseményekkel való munka során fontos szempont, hogy előfordulhat, hogy egy adott eseményhez nincs objektum regisztrálva. Meg kell írnia a kódot úgy, hogy ne váltson ki eseményeket, ha nincsenek beállítva hallgató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énykezelő leiratkozzon az eseményforrásról, amikor már nincs szükség az eseményekre.
Az eseménytámogatás céljainak megtervezése
Az események nyelvi kialakítása a következő célokat célozza:
- Minimális összekapcsolás engedélyezése egy eseményforrás és egy esemény fogadója között. Ezt a két összetevőt különböző szervezetek írhatják, és akár más ütemezés szerint is frissíthetők.
- Egyszerűnek kell lennie egy eseményre feliratkozni, és leiratkozni 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 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.
A event kulcsszóval definiálhat egy eseményt:
public event EventHandler<FileFoundArgs>? FileFound;
Az esemény típusának (ebben a példábanEventHandler<FileListArgs>) delegált típusnak kell lennie. Az események deklarálása során követendő konvenciók. 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 múlt időt, amikor az esemény valamit jelent, ami megtörtént. Egy jelenlegi feszült igét (például Closing) használva jelentsen valamit, ami 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 Closing esemény tartalmazhat például egy argumentumot, amely jelzi, hogy a záró művelet folytatódik-e, vagy sem. Más forgatókönyvek lehetővé teszik 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 állíthat be, amely jelzi, hogy az algoritmus milyen következő műveletet fog elvégezni. Az eseménykezelő az eseményargumentum tulajdonságainak módosításával más műveletet is végrehajthat.
Amikor ki szeretné váltani az eseményt, az eseménykezelőket a delegált meghívási szintaxist használva hívja meg.
FileFound?.Invoke(this, new FileFoundArgs(file));
Ahogy az meghatalmazottakcímű szakaszban is szó volt róla, a ?. operátor megkönnyíti annak biztosítását, hogy ne kísérelje meg az eseményt előhozni, ha nincs előfizetője az eseménynek.
Az eseményre a += operátorral iratkozhat fel:
var fileLister = new FileSearcher();
int filesFound = 0;
EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>
{
Console.WriteLine(eventArgs.FoundFile);
filesFound++;
};
fileLister.FileFound += onFileFound;
A kezelőmetódus általában a "Be" előtaggal, majd az esemény nevével rendelkezik, ahogyan az az előző kódban is látható.
Leiratkozhat a -= operátor használatával:
fileLister.FileFound -= onFileFound;
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 nem tesz semmit.
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.