Meghatalmazottak és események megkülönböztetése
A .NET Core platformon új fejlesztők gyakran küzdenek, amikor egy terv alapján delegates
döntenek, és a terv alapján döntenek events
. A meghatalmazottak vagy események kiválasztása gyakran nehéz, mert a két nyelvi funkció hasonló. Az események még a meghatalmazottak nyelvi támogatásával is létre vannak hozva.
Mindkettő késői kötési forgatókönyvet kínál: lehetővé teszik azokat a forgatókönyveket, amelyekben egy összetevő egy olyan metódus meghívásával kommunikál, amely csak futásidőben ismert. Mindkettő támogatja az egy- és több előfizetői metódust. Ezt az egycímes és csoportos küldési támogatásnak is nevezik. Mindkettő hasonló szintaxist támogat a kezelők hozzáadásához és eltávolításához. Végül egy esemény létrehozása és egy meghatalmazott meghívása pontosan ugyanazt a metódushívási szintaxist használja. Mindkettő ugyanazt a metódusszintaxist támogatja az Invoke()
?.
operátorral való használathoz.
Mindezek a hasonlóságok, könnyen nehéz meghatározni, hogy mikor kell használni.
Az események meghallgatása nem kötelező
A használni kívánt nyelvi funkció meghatározásának legfontosabb szempontja, hogy van-e csatolt előfizető. Ha a kódnak meg kell hívnia az előfizető által megadott kódot, akkor a visszahívás implementálásához meghatalmazottakon alapuló tervet kell használnia. Ha a kód minden munkát el tud végezni előfizetők meghívása nélkül, akkor eseményeken alapuló kialakítást kell használnia.
Tekintse át az ebben a szakaszban létrehozott példákat. Az elemek megfelelő rendezése érdekében a létrehozott List.Sort()
kódnak összehasonlító függvényt kell kapnia. A LINQ-lekérdezéseket meg kell adni a meghatalmazottaknak, hogy meghatározhassák, milyen elemeket kell visszaadni. Mindketten meghatalmazottakból álló tervet használtak.
Fontolja meg az eseményt Progress
. Egy tevékenység előrehaladását jelenti.
A feladat továbbra is folytatódik, függetlenül attól, hogy vannak-e figyelők.
Ez FileSearcher
egy másik példa. Továbbra is megkeresi és megkeresi a keresett fájlokat, még akkor is, ha nincsenek esemény-előfizetők csatolva.
Az UX-vezérlők továbbra is megfelelően működnek, még akkor is, ha nincsenek előfizetők az eseményeket figyelve. Mindketten események alapján terveznek.
A visszaadott értékekhez meghatalmazottakra van szükség
Egy másik szempont a módszer prototípusa, amelyet a delegált metódushoz szeretne használni. Mint látható, az eseményekhez használt meghatalmazottak mindegyike érvénytelen visszatérési típussal rendelkezik. Azt is láthatta, hogy vannak olyan kifejezések, amelyekkel olyan eseménykezelők hozhatók létre, amelyek az eseményargumentum-objektum tulajdonságainak módosításával adják vissza az információkat az eseményforrásnak. Bár ezek az idiómák működnek, nem olyan természetesek, mint egy metódusból származó érték visszaadása.
Figyelje meg, hogy ez a két heurisztika gyakran jelen lehet: Ha a delegált metódus értéket ad vissza, az valószínűleg valamilyen módon hatással lesz az algoritmusra.
Az események privát meghívást kaptak
Az eseményt tartalmazótól eltérő osztályok csak eseményfigyelőket adhatnak hozzá és távolíthatnak el; Csak az eseményt tartalmazó osztály hívhatja meg az eseményt. Az események általában nyilvános osztálytagok. Ehhez képest a meghatalmazottak gyakran paraméterként vannak átadva, és privát osztálytagokként vannak tárolva, ha egyáltalán tárolják őket.
Az eseményfigyelőknek gyakran hosszabb élettartamuk van
Az eseményfigyelők hosszabb élettartamuk valamivel gyengébb indoklást jelent. Előfordulhat azonban, hogy az eseményalapú kialakítások természetesebbek, ha az eseményforrás hosszú időn keresztül eseményeket hoz létre. Számos rendszeren láthat példákat az UX-vezérlők eseményalapú tervezésére. Miután előfizetett egy eseményre, az esemény forrása a program teljes élettartama alatt eseményeket hozhat létre. (Leiratkozhat az eseményekről, ha már nincs rájuk szüksége.)
Ellentétben a számos delegáltalapú tervvel, ahol egy delegáltat használnak argumentumként egy metódushoz, és a delegáltat a metódus visszatérése után nem használja a rendszer.
Gondosan értékelje ki
A fenti szempontok nem nehéz és gyors szabályok. Ehelyett útmutatást nyújtanak, amely segít eldönteni, hogy melyik választás a legjobb az adott használathoz. Mivel ezek hasonlóak, akár prototípust is készíthet, és megfontolhatja, hogy melyik lenne természetesebb a munka. Mindkettő jól kezeli a késői kötési forgatókönyveket. Használja azt, amelyik a legjobban kommunikál a tervével.