Vergelijkingstabel
Basis voor vergelijking | afgevaardigden | Evenementen |
---|---|---|
basis- | Een afgevaardigde houdt de referentie van een methode bij. | De gebeurtenis is een gelaagde abstractie die aan de afgevaardigden wordt verstrekt. |
Syntaxis | delegate return_type delegate_name (parameter_list); | event event_delegate event_name; |
keyword | Een afgevaardigde wordt gedeclareerd met een sleutelwoord "delegate". | Een evenement wordt gedeclareerd met een sleutelwoord "evenement". |
Verklaring | Een afgevaardigde wordt buiten de klas verklaard. | Een evenement wordt binnen een klas verklaard. |
Beroep doen op | Om een methode aan te roepen, moet deze naar de gedelegeerde worden verwezen. | Om een methode op te roepen moet deze aan de gebeurtenis worden toegewezen. |
Covariantie en contravariantie | Ze bieden flexibiliteit aan de afgevaardigden. | Geen dergelijk concept. |
Event Accessor | Geen dergelijk concept. | Beheert de lijst met gebeurtenishandlers. |
Afhankelijkheid | Afgevaardigden zijn onafhankelijk van evenementen. | Het evenement kan niet worden gemaakt zonder afgevaardigden. |
Definitie van afgevaardigden
In C # worden gedelegeerden gebruikt als een functie wijzer om een methode te verwijzen. Het is specifiek een object dat verwijst naar een methode die eraan is toegewezen. Dezelfde afgevaardigde kan worden gebruikt om verschillende methoden te verwijzen, omdat deze de referentie van verschillende methoden kan bevatten, maar één voor één. Welke methode door de gedelegeerde wordt ingeroepen, wordt bepaald tijdens de runtime. De syntaxis van het declareren van een afgevaardigde is als volgt:
delegate return_type delegate_name (parameter_list);
Hier geeft het return_type het type waarde terug dat is geretourneerd door de methode, die wordt opgeroepen door delegate en delegate_name is de naam van de gedelegeerde. De parameterlijst definieert de lijst met parameters die vereist zijn door de methoden die door de deelnemer worden opgeroepen.
Er zijn enkele belangrijke punten om te onthouden over de afgevaardigden. Het kan elke methode aanroepen die overeenkomt met de handtekening en het retourneringstype. Een gedelegeerde kan zowel een instantiemethode als een statische methode aanroepen. Als het een instantiemethode aanroept, moet het de hulp van een object gebruiken om de methode aan te roepen. Afgevaardigden ondersteunen multicasting, dwz u kunt de methoden die automatisch worden aangeroepen als de gedelegeerde die ernaar verwijst, gebruiken. U hoeft alleen maar een gedelegeerd object te maken en de methoden achter elkaar aan de keten toe te wijzen met behulp van de operator "+ =". U kunt ook een methode ontkoppelen met de operator "- =".
De functies die de afgevaardigde extra flexibiliteit bieden, zijn Covariance en Contravariance. Covariantie en contravariantie staan de voorwaarde toe dat het retourneertype en de handtekening van de aan gedelegeerde toegewezen methode verschillen van die van de gedelegeerde.
- Met Covariance kunt u een methode toewijzen aan de gedelegeerde waarbij het retourneringstype van de methode een klasse is die is afgeleid van de klasse die het retentietype van de gedelegeerde opgeeft.
- Contravariantie stelt u in staat om een methode toe te wijzen aan de gedelegeerde waarbij het parametertype van de methode een basisklasse is van de klasse die is opgegeven als de parameter van de gedelegeerde.
Definitie van evenementen
Gebeurtenissen zijn de uitgevoerde acties die de toestand van een object wijzigen. Gebeurtenissen worden gedeclareerd met behulp van afgevaardigden, zonder de aanwezigheid van afgevaardigden kunt u evenementen niet declareren. Je kunt zeggen dat een evenement inkapseling biedt aan de deelnemers. Er zijn twee belangrijke samenstellingen als het gaat om evenementen die event- en event-handlers zijn. Als de objecten geïnteresseerd zijn in het evenement, registreert het een gebeurtenishandler voor die specifieke gebeurtenis. En wanneer de gebeurtenissen worden afgevuurd, worden de geregistreerde gebeurtenishandlers aangeroepen. De verklaring van het evenement is als volgt:
event event_delegate event_name;
Hier is "evenement" een sleutelwoord dat de verklaring van een gebeurtenis toont. Vervolgens toont event_delegate de naam van de afgevaardigde die de gebeurtenis ondersteunt. Vervolgens is event_name de naam van de gebeurtenis
Er zijn enkele belangrijke punten om te onthouden tijdens het omgaan met de gebeurtenissen. Net als gedelegeerden kunnen gebeurtenissen ook multicast zijn, dwz meerdere objecten die aan een gebeurtenishandler zijn vastgeketend (geregistreerd), reageren wanneer een gebeurtenis wordt opgehaald. De gebeurtenishandlers kunnen aan de keten worden toegevoegd met behulp van de operator "+ =" en kunnen worden ontketend met behulp van de operator "- =" Zowel de statische methode als de instantiemethode kunnen worden gebruikt als gebeurtenishandler. De gebeurtenissentoegang kan u de controle geven over de implementatie van de lijst met gebeurtenishandlers.
De interface kan gebeurtenissen bevatten. Gebeurtenissen kunnen ook abstract zijn, terwijl op een toegang gebaseerde gebeurtenis niet abstract kan zijn. De gebeurtenis kan virtueel zijn en kan worden opgeheven door afgeleide klasse.
Belangrijkste verschillen tussen afgevaardigden en gebeurtenissen in C #
- Delegate is een object dat wordt gebruikt als een functiepointer om de referentie van een methode vast te houden. Aan de andere kant bieden gebeurtenissen een abstractie voor afgevaardigden.
- Een sleutelwoord dat vereist is om een gedelegeerde aan te geven is een afgevaardigde terwijl een sleutelwoord dat vereist is om een evenement te declareren een gebeurtenis is.
- Een afgevaardigde wordt buiten een klas verklaard, terwijl een evenement in een klas wordt verklaard.
- Om een methode op te roepen met een gedelegeerd object, moet de methode worden verwezen naar het delegatieobject. Aan de andere kant, om een methode aan te roepen met behulp van een gebeurtenisobject, moet de methode worden verwezen naar het gebeurtenisobject.
- Covariance en Contravariantie bieden extra flexibiliteit aan de gedelegeerde objecten. Aan de andere kant heeft een evenement dergelijke concepten niet.
- Event Accessor behandelt de lijst met gebeurtenishandlers, terwijl afgevaardigde zo'n concept niet heeft.
- Afgevaardigden zijn onafhankelijk van gebeurtenissen, maar evenementen kunnen niet zonder afgevaardigde worden gemaakt.
Conclusie:
Gedelegeerden zijn handig omdat ze evenementen ondersteunen en bieden de mogelijkheid om de methode tijdens runtime uit te voeren. Met de gebeurtenissentoegang kunnen we de gebeurtenishandlers in multithreading-applicaties synchroniseren.