Подтвердить что ты не робот

С# удаление обработчика событий

Я делал это некоторое время, но я не заметил, что каждый раз, когда я удаляю обработчик событий, я использую new. Должен ли я создавать новый объект?

В принципе существует разница между 1 и 2?

  • ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

  • ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

EDIT: Хорошо, это дубликат. Извини за это. Ответ отправлен здесь.

Два делегата одного типа с одинаковыми целями, методами и списками вызовов считаются равными.

4b9b3361

Ответ 1

Нет разницы между 1 и 2, потому что 2 является синтаксическим сахаром для 1. Только если 2, упомянутый в поле экземпляра делегата класса класса, а не в имени фактического метода, будет разница в скомпилированном IL.

С точки зрения того, что происходит во время выполнения, метод event Remove, похоже, не заботится о том, передан ли ему экземпляр делегата, тот же, что и тот, который передан методу Add. Я не могу вспомнить, почему это так, но я бы предположил, что экземпляры делегатов всегда интернированы.

EDIT: Джон Скит говорит, что метод Remove использует значение равенства (Delegate.Equals), чтобы определить, какой делегат удалить из списка, а не интернировать + ссылочное равенство. Тот же конечный результат, другой метод.: -)

Ответ 2

Вторая версия эквивалентна первой; он просто использует более короткий синтаксис. Это было реализовано в С# 2.0