Почему «новый» оператор работает для отсоединения обработчика событий с помощью - =? - PullRequest
6 голосов
/ 12 декабря 2011

Почему я должен использовать следующее, чтобы отсоединить событие?

object.myEvent -= new MyEvent(EventHandler);

Я немного раздражен тем, что оператор new работает.

Может кто-нибудь объяснить?

Обновление

Я уже знаю, что мне не нужно использовать оператор new для отсоединения событий, но в Visual Studio 2010 это предложение по-умолчанию для автоматического завершения. Мой реальный вопрос - как - = новая работа для процесса отсоединения. Как новый объект / делегат может соответствовать ранее созданному объекту / делегату на стороне + =?

1 Ответ

12 голосов
/ 12 декабря 2011

Вам не нужно использовать оператор new. Вы не должны были с тех пор, как вышел C # 2.0:

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

При этом используется преобразование группы методов для создания делегата из группы методов (имя метода). Это касается не только событий:

Action<string> writeToConsole = Console.WriteLine;

РЕДАКТИРОВАТЬ: Что касается , как это работает:

  • Использование -= в событии в итоге вызывает вызов метода доступа «remove», который обычно использует -= для делегата ... (по крайней мере, эффективно)
  • Использование -= для делегата является синтаксическим сахаром для Delegate.Remove
  • Delegate.Remove использует равенство делегатов - два экземпляра делегата равны, если у них одинаковый метод и один и тот же целевой экземпляр (например, методы)

Обратите внимание, что при использовании преобразования группы методов каждый раз при создании кода будет создаваться новый экземпляр делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...