Сравнителна таблица
Основа за сравнение | Делегатите | Събития |
---|---|---|
Основен | Делегатът притежава препратка към метод. | Събитието е надслойна абстракция, предоставена на делегатите. |
Синтаксис | делегат return_type delegate_name (параметър-списък); | event_delegate event_name; |
Ключова дума | Делегат е обявен с ключова дума "делегат". | Събитие се обявява с помощта на ключова дума "събитие". |
декларация | Делегат се обявява извън клас. | Събитието се обявява в клас. |
призовавам | За да извикате метод, той трябва да бъде препратен към делегата. | За да извикате метод, той трябва да бъде присвоен на събитието. |
Коварианс и контравианс | Те предоставят гъвкавост на делегатите. | Няма такова понятие. |
Достъп до събитие | Няма такова понятие. | Управлява списъка с манипулаторите на събития. |
Зависимост | Делегатите са независими от събитията. | Събитието не може да бъде създадено без делегати. |
Определение на делегатите
В C # делегатите се използват като указател на функцията за препращане на метод. Това е конкретен обект, който се отнася до метод, който му е присвоен. Същият делегат може да бъде използван за препращане на различни методи, тъй като той е способен да държи позоваването на различни методи, но един по един. Кой метод ще бъде извикан от делегата се определя по време на изпълнение. Синтаксисът за деклариране на делегат е следният:
делегат return_type delegate_name (параметър-списък);
Тук return_type декларира типа стойност, върната от метода, който се извиква от делегат и delegate_name е името на делегат. Списъкът с параметри определя списъка с параметри, изисквани от методите, които ще бъдат извикани от делегата.
Има някои важни моменти, които трябва да се помнят за делегатите. Той може да извика всеки метод, който съответства на неговия подпис и типа на връщане. Делегатът може да извика както метод на инстанция, така и статичен метод. Ако извика метод на инстанция, той трябва да вземе помощта на обекта, за да извика метода. Делегатите поддържат мултикаст, т.е. можете да свържете методите, които ще се извикват автоматично, когато делегатът, който се отнася към тях, бъде извикан. Трябва просто да създадете делегатски обект и да зададете методите един след друг на веригата, като използвате оператор "+ =". Можете също да развържете метод с помощта на оператор "- =".
Характеристиките, които придават допълнителна гъвкавост на делегатите, са ковариацията и контравариацията. Ковариацията и контравариацията позволяват състоянието, при което типът на връщане и подписът на метода, определен за делегат, са различни от този на делегат.
- Ковариацията ви позволява да присвоите метод на делегат, където типът на връщане на метода е клас, който се извлича от класа, който указва типа връщане на делегат.
- Contravariance ви позволява да присвоите метод на делегат, където типът параметър на метода е базов клас на класа, който е определен като параметър на делегат.
Дефиниция на събития
Събития са извършеното действие, което променя състоянието на обект. Събитията се обявяват с помощта на делегати, без присъствието на делегати не можете да декларирате събития. Може да се каже, че дадено събитие осигурява капсулиране на делегатите. Има два важни компонента, когато се занимаваме със събития, които са обработчици на събития и събития. Ако обектите се интересуват от събитието, тогава той регистрира манипулатор на събитие за това конкретно събитие. И всеки път, когато събитията се изстрелват, се извикват регистрираните манипулатори на събития. Декларацията на събитието е следната:
event_delegate event_name;
Тук „event“ е ключова дума, която показва декларацията за събитие. След това event_delegate показва името на делегата, който поддържа събитието. След това име на събитието е името на събитието
Има някои важни моменти, които трябва да се помнят, докато се занимавате със събитията. Подобно на делегатите, събития могат да бъдат и мултикаст, т.е. множество обекти, които са привързани (регистрирани) към манипулатор на събития, реагират, когато събитие е повдигнато. Обработвателите на събития могат да бъдат добавени към веригата, като се използва операторът "+ =" и могат да бъдат развързани с помощта на оператора "- =" И двата метода могат да се използват като манипулатор на събития. Accessor на събитието може да ви даде контрол върху реализацията на списъка с манипулатори на събития.
Интерфейсът може да съдържа събития. Събитията също могат да бъдат абстрактни, докато събитие на базата на достъп не може да бъде абстрактно. Събитието може да бъде виртуално и да бъде заменено от извлечения клас.
Ключови разлики между делегати и събития в C #
- Делегатът е обект, използван като показалец на функция за задържане на препратката към метод. От друга страна, събитията предоставят абстракция на делегатите.
- Ключова дума, необходима за деклариране на делегат, е делегат, докато ключова дума, необходима за деклариране на събитие, е събитие .
- Делегат се обявява извън клас, докато събитие се декларира в клас.
- За да извикате метод, използващ делегиран обект, методът трябва да се отнася към обекта на делегирания. От друга страна, за да извикате метод, използващ обект на събитие, методът трябва да се отнася към обекта на събитието.
- Ковариансът и контравариасията осигуряват допълнителна гъвкавост на делегираните обекти. От друга страна, събитието няма такива понятия.
- Event Accessor обработва списъка на обработващите събития, докато делегатът няма такава концепция.
- Делегатите са независими за събитията, но събития не могат да бъдат създавани без делегат.
Заключение:
Делегатите са полезни, тъй като поддържат събития и осигуряват възможност за изпълнение на метода по време на изпълнение. Достъпът за събития ни позволява да синхронизираме манипулаторите на събития в многопоточни приложения.