Pourquoi le “nouvel” opérateur travaille-t-il pour détacher un gestionnaire d’événements en utilisant – =?

Pourquoi dois-je utiliser ce qui suit pour détacher un événement?

object.myEvent -= new MyEvent(EventHandler); 

Je suis un peu irrité par le travail du nouvel opérateur.

Quelqu’un peut-il expliquer?

Mettre à jour

Je sais déjà que je n’ai pas besoin d’utiliser le nouvel opérateur pour détacher des événements, mais il s’agit toujours de la suggestion de saisie semi-automatique dans Visual Studio 2010. Ma vraie question est de savoir comment – = new fonctionne pour le processus de détachement. Comment un nouvel object / délégué peut-il correspondre à un object / délégué créé précédemment sur le côté + =?

Vous n’êtes pas obligé d’utiliser le new opérateur. Vous n’avez pas eu à le faire depuis la sortie de C # 2.0:

 foo.SomeEvent += EventHandler; foo.SomeEvent -= EventHandler; 

Cette opération utilise une conversion de groupe de méthodes pour créer un délégué à partir du groupe de méthodes (le nom de la méthode). Ce n’est pas juste pour les événements, soit:

 Action writeToConsole = Console.WriteLine; 

EDIT: Quant à la façon dont cela fonctionne:

  • L’utilisation de -= sur un événement finit par appeler l’appeleur “remove”, qui utilise généralement -= sur un délégué … (au moins de manière efficace).
  • Utiliser -= sur un délégué est un sucre syntaxique pour Delegate.Remove
  • Delegate.Remove utilise l’égalité de délégué – deux instances de délégué sont égales si elles ont la même méthode et la même instance cible (pour les méthodes d’instance)

Notez que l’utilisation d’une conversion de groupe de méthodes créera toujours une nouvelle instance du délégué chaque fois que vous parcourez le code.