Vraag C # -gebeurtenissen definiëren zonder een externe gedelegeerdefinitie


gewoon uit nieuwsgierigheid: is het mogelijk om gebeurtenissen in C # te definiëren zonder van tevoren een gedelegeerd type te definiëren?

zoiets als public event (delegate void(int)) EventName


13
2018-03-19 15:30


oorsprong


antwoorden:


Nee, het is niet mogelijk; ECMA-334, § 17.7 stelt:

Het type van een gebeurtenisverklaring is van het type gedelegeerde (§11.2)

en § 11.2 definieert:

delegate-type:
    type-name

Sinds C # 3 kunt u echter verschillende vooraf gedefinieerde generieke typen gebruiken, zoals Action<int> zodat je bijna niet je eigen gedelegeerde typen hoeft te definiëren.


3
2018-03-19 15:46



Er is generiek gedelegeerde typen ingebouwd, Action<> en Func<>, waarbij actie ongeldig wordt geretourneerd. Elk generiek type argument is van het type type van het argument dat moet worden doorgegeven aan de gedelegeerde. bijv.

public event Action<int> EventName;

Er is ook een generiek EventHandler<T> om de conventie van het doorgeven van de Object-afzender te volgen en een EventArgs-type te hebben.


13
2018-03-19 15:47



Nee, AFAIK dit is niet mogelijk met C #.

De reden waarom ik dat denk is dat een .NET-evenement in feite een afgevaardigde is waaraan bepaalde beperkingen zijn toegevoegd. Dat is de event trefwoord definieert geen nieuw type; conceptueel gesproken is het meer een wijziger (denk aan dingen zoals private of readonly), die wordt gebruikt in een verklaring om een ​​reeds bestaand gedelegeerd type te wijzigen. Het is deze wijziging die de beperkingen toevoegt:

public EventHandler x;

Dit is een normale afgevaardigde die kan worden doorgegeven (gekopieerd) en door iedereen kan worden opgeroepen.

public event EventHandler x;

Onder de motorkap is dit ook een normale afgevaardigde, maar deze kan alleen worden ingesteld (=) en opgeroepen door het type met x; verder kan de afgevaardigde niet worden doorgegeven aan derden; deze kunnen alleen het add (+=) en remove (-=) activiteiten.


0
2018-03-19 15:40