ne comprennent pas pleinement ce que cela signifie
Fixons votre compréhension. Supposons que vous ayez:
class C
{
int x;
void M(int y)
{
int z = GetZ();
Func<int, int> f = q => q + x + y + z;
...
f est un délégué. Il a un récepteur et une méthode qui est une méthode du récepteur. (Notez, ce n'est pas vraiment une exigence stricte, mais le cas de coin est obscur pour nos fins aujourd'hui.)
Quel type est le récepteur qui a cette méthode? Cela peut-il être C, avec le récepteur égal à this
?
Non pourquoi pas? Parce que alors, comment pouvons-nous garder la trace de la valeur de y et z? Il pourrait y avoir une valeur différente pour chaque appel de M, donc le destinataire ne peut pas être this
.
Ce que le compilateur ne génère est une nouvelle classe:
class C
{
int x;
class Locals
{
public C __this;
public int y;
public int z;
public int A(int q) { return q + __this.x + y + z; }
}
void M(int y)
{
Locals locals = new Locals();
locals.__this = this;
locals.y = y;
locals.z = GetZ();
Func<int, int> f = locals.A;
...
Alors, quel est le récepteur? la valeur des habitants. Quelle est la méthode? A.
Bien sûr, les Locaux et A sont donnés des noms fous de sorte que vous ne pouvez pas les appeler par accident.
Dans les cas où j'utilise une méthode anonyme, est-il un moyen d'extraire la cible réelle
Vous extrayez le récepteur réel, je vous le promets.
« travaille sur une extension pour faire des choses avec des gestionnaires d'événements et je dois être en mesure de discerner ce qui est
une cible de gestionnaires d'événements S'il vous plaît ne pas le faire. Le destinataire d'un gestionnaire d'événements est un détail d'implémentation du code fourni par le gestionnaire. Ce n'est pas là pour prendre des décisions. Les compilateurs ont tout à fait le droit de faire tout ce qu'ils veulent quand ils génèrent un récepteur pour un gestionnaire d'événement, ce qu'ils font. Considérez ce qui se passe si le gestionnaire d'événements a été créé à l'intérieur d'un bloc d'itérateur ou d'une méthode asynchrone, par exemple. Ou l'événement est souscrit par un code d'extensions réactives qui applique des opérations de séquence à l'événement. Encore une fois, le compilateur générera des classes partout. Vous ne pouvez pas compter sur le fait que la classe soit quelque chose de "sensé". La seule chose sur laquelle vous pouvez compter est: l'abonné souhaitait que la méthode donnée soit appelée quand quelque chose se produisait. C'est le contrat que vous devez obéir; n'essayez pas de deviner l'abonné.
Quel est le problème avec l'utilisation du premier paramètre ('sender')? – spender
@spender Le problème est que dans certains cas, l'expéditeur sera nul. L'expéditeur n'est pas impliqué pour être la cible de toute façon. Ce serait comme envoyer un paquet de moi-même, non? – Will
... était juste en train de rattraper votre précédente question ... ignorer le commentaire précédent. – spender