L'ajout et la Suppression Anonyme Gestionnaire d'Événements
Je me demandais si cela a effectivement travaillé ?
private void RegisterKeyChanged(T item)
{
item.OnKeyChanged += (o, k) => ChangeItemKey((T)o, k);
}
private void UnRegisterKeyChanged(T item)
{
item.OnKeyChanged -= (o, k) => ChangeItemKey((T)o, k);
}
Comment le compilateur de savoir que les gestionnaires d'événements sont les mêmes ? Est-ce recommandé?
- Double Possible de vous Désinscrire anonyme méthode en C#
Vous devez vous connecter pour publier un commentaire.
Il y a une page MSDN qui en parle:
Comment s'Abonner et de se Désabonner à partir d'Événements
Note en particulier:
Et aussi:
Pour toute personne intéressée, vous pouvez ajouter et supprimer un anonyme, un gestionnaire d'événements comme cette
Mise à JOUR:
En C# 7.0 nous prend en charge pour les fonctions locales de sorte que le
TuneGuitar
méthode peut maintenant être écrite comme suit:Si vous avez besoin de vous désabonner d'un gestionnaire d'événement, vous aurez besoin d'avoir une certaine référence à un béton délégué. En regardant
Délégué.L'égalité
, vous trouverez que les délégués ne sont pas simplement par rapport à l'aide de la référence à l'égalité, mais ce n'est pas grave pour les délégués anonymes.Pour un délégué anonyme, le compilateur (en gros) crée un nouveau "non anonyme" délégué pour délégué anonyme, même si le délégué organes sont les mêmes. De ce fait, le cadre ne sera pas trouver le délégué de vous désabonner quand vous utilisez l'exemple de code que vous avez donné.
Qui ne fonctionne pas, j'ai peur, car les deux expressions lambda (et délégués) que vous avez déclarés sont en fait des objets différents, et le retour des références différentes. Ainsi, la suppression de la fonction (
-=
) échouera toujours.La solution commune à ce problème (là où vous devez supprimer le gestionnaire) est tout simplement de refactoriser le lamba expression dans une bonne méthode. Une alternative est de maintenir une variable de classe pour le gestionnaire d'événement délégué, et ajouter et supprimer des ce, bien que personnellement, je suis pas un fan de lui. (C'est plus de tracas que de créer une méthode normale, si quoi que ce soit.)
Je ne crois pas que cela va fonctionner. Si vous avez vraiment besoin pour vous désinscrire d'un événement, vous devez spécifier explicitement un gestionnaire d'événements qui, plus tard, vous pourrez vous désinscrire de la place d'un délégué anonyme.
Si vous vérifiez avec le document de Délégué.L'égalité, vous trouverez qu'ils ne sont pas comparés par référence.