Различия в назначении обработчиков событий С#?

Я всегда назначал такие обработчики событий, руководствуясь автозавершением Intellisense.

RangeSelector.RangeChanged += new EventHandler(RangeSelector_RangeChanged);

Недавно я заметил, что один из моих коллег делает это таким образом.

RangeSelector.RangeChanged += RangeSelector_RangeChanged;

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

Каковы различия, преимущества или недостатки этих методов. Приводят ли они к одному и тому же коду IL или есть какая-то тонкая разница, о которой мне нужно знать?


person Steve Crane    schedule 25.08.2009    source источник


Ответы (4)


Каковы различия, преимущества или недостатки этих методов.

Второй метод новее, т.е. он поддерживается только с C# 2.0 (я полагаю), в котором добавлено автоматическое преобразование из группы методов (то есть имени метода) в делегат. Таким образом, вызов конструктора добавляется компилятором, а второй метод является просто синтаксическим сахаром для первого.

Из-за этого между ними нет других различий.

Поскольку второй метод делает то же самое, что и первый, но с меньшим количеством синтаксиса, ему следует отдать предпочтение.

person Konrad Rudolph    schedule 25.08.2009
comment
Кроме того, если вы измените сигнатуру события, вам нужно изменить код только в двух местах: в объявлении события и в самом обработчике, но не везде, где вы назначаете/отменяете назначение обработчика. - person Matthew Scharley; 25.08.2009
comment
+1, однако, что следует предпочесть, это сомнительно. Если ввести +=, а затем дважды нажать кнопку табуляции, будет сгенерирован более новый синтаксис, я соглашусь. В настоящее время самый быстрый способ добавить обработчик событий — создать старый синтаксис с помощью IDE. - person AnthonyWJones; 25.08.2009
comment
@Matthew Scharley: если вы используете встроенную поддержку рефакторинга Visual Studio, вам не придется беспокоиться о таких вещах. - person Ian Kemp; 25.08.2009
comment
@Энтони: я навязчивый перфекционист, я использую автозаполнение, а затем возвращаюсь, чтобы отредактировать дерьмо, которое оно произвело вручную. Визуальный беспорядок в коде — враг. - person Konrad Rudolph; 25.08.2009
comment
Спасибо, парни. Думаю, тогда я начну использовать вторую форму. - person Steve Crane; 25.08.2009

Без разницы, получается тот же IL.

Это просто способ сказать то же самое с меньшим количеством кода.

person Nifle    schedule 25.08.2009

Результат одинаков в обоих случаях. Но в последнем случае компилятор C# выведет тип EventHandler из кода, что сэкономит вам несколько нажатий клавиш.

person Peter Lillevold    schedule 25.08.2009

да, компилятор создает один и тот же код IL в обоих случаях, второй случай - это просто синтаксический сахар

person Arsen Mkrtchyan    schedule 25.08.2009