Dela via


Händelsedesign

Kommentar

Det här innehållet skrivs om med behörighet från Pearson Education, Inc. från Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Den utgåvan publicerades 2008, och boken har sedan dess reviderats helt i den tredje utgåvan. En del av informationen på den här sidan kan vara inaktuell.

Händelser är den vanligaste formen av återanrop (konstruktioner som gör att ramverket kan anropa användarkod). Andra återanropsmekanismer är medlemmar som tar ombud, virtuella medlemmar och gränssnittsbaserade plugin-program. Data från användbarhetsstudier visar att majoriteten av utvecklarna är mer bekväma med att använda händelser än de använder de andra motringningsmekanismerna. Evenemang är snyggt integrerade med Visual Studio och många språk.

Det är viktigt att observera att det finns två grupper av händelser: händelser som genereras innan ett tillstånd för systemet ändras, som kallas förhändelser och händelser som genereras efter en tillståndsändring, som kallas post-events. Ett exempel på en förhändelse skulle vara Form.Closing, som utlöses innan ett formulär stängs. Ett exempel på en posthändelse skulle vara Form.Closed, som utlöses när ett formulär har stängts.

✔️ Använd termen "raise" för händelser i stället för "fire" eller "trigger".

✔️ Använd System.EventHandler<TEventArgs> i stället för att manuellt skapa nya ombud som ska användas som händelsehanterare.

✔️ ÖVERVÄG att använda en underklass av EventArgs som händelseargument, såvida du inte är helt säker på att händelsen aldrig behöver överföra några data till händelsehanteringsmetoden, i vilket fall du kan använda EventArgs typen direkt.

Om du skickar ett API direkt kan EventArgs du aldrig lägga till några data som ska överföras med händelsen utan att bryta kompatibiliteten. Om du använder en underklass, även om den ursprungligen är helt tom, kan du lägga till egenskaper i underklassen när det behövs.

✔️ Använd en skyddad virtuell metod för att skapa varje händelse. Detta gäller endast för icke-statiska händelser i oförseglade klasser, inte för structs, förseglade klasser eller statiska händelser.

Syftet med metoden är att tillhandahålla ett sätt för en härledd klass att hantera händelsen med hjälp av en åsidosättning. Åsidosättande är ett mer flexibelt, snabbare och mer naturligt sätt att hantera basklasshändelser i härledda klasser. Enligt konventionen ska namnet på metoden börja med "På" och följas med namnet på händelsen.

Den härledda klassen kan välja att inte anropa basimplementeringen av metoden i dess åsidosättning. Förbered dig för detta genom att inte inkludera någon bearbetning i den metod som krävs för att basklassen ska fungera korrekt.

✔️ Ta en parameter till den skyddade metoden som genererar en händelse.

Parametern ska namnges e och ska skrivas som händelseargumentklass.

❌ Skicka INTE null som avsändare när du skapar en icke-statisk händelse.

✔️ Skicka null som avsändare när du skapar en statisk händelse.

❌ Skicka INTE null som händelsedataparameter när du skapar en händelse.

Du bör skicka EventArgs.Empty om du inte vill skicka några data till händelsehanteringsmetoden. Utvecklare förväntar sig att den här parametern inte är null.

✔️ ÖVERVÄG att skapa händelser som slutanvändaren kan avbryta. Detta gäller endast för förhändelser.

Använd System.ComponentModel.CancelEventArgs eller dess underklass som händelseargument för att tillåta slutanvändaren att avbryta händelser.

Design för anpassad händelsehanterare

Det finns fall där EventHandler<T> det inte går att använda, till exempel när ramverket behöver arbeta med tidigare versioner av CLR, som inte har stöd för generics. I sådana fall kan du behöva utforma och utveckla en anpassad händelsehanterardelegat.

✔️ Använd en returtyp av void för händelsehanterare.

En händelsehanterare kan anropa flera metoder för händelsehantering, eventuellt på flera objekt. Om metoder för händelsehantering tilläts returnera ett värde skulle det finnas flera returvärden för varje händelseanrop.

✔️ Använd object som typ av den första parametern för händelsehanteraren och anropa den sender.

✔️ Använd System.EventArgs eller dess underklass som typ av den andra parametern för händelsehanteraren och anropa den e.

❌ HA INTE fler än två parametrar för händelsehanterare.

Portioner © 2005, 2009 Microsoft Corporation. Med ensamrätt.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, publicerad 22 okt 2008 av Addison-Wesley Professional som en del av Microsoft Windows Development Series.

Se även