Разница между событиями проводки с и без "новых"

В С# какая разница (если есть) между этими двумя строками кода?

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);

и

tmrMain.Elapsed += tmrMain_Tick;

Оба, похоже, работают точно так же. Предполагается ли, что С# означает, что вы имеете в виду первое, когда вы вводите последнее?

Ответ 1

Я сделал это

static void Hook1()
{
    someEvent += new EventHandler( Program_someEvent );
}

static void Hook2()
{
    someEvent += Program_someEvent;
}

И затем запустил ildasm над кодом.
Сгенерированная MSIL была точно такой же.

Итак, чтобы ответить на ваш вопрос, да, это одно и то же. Компилятор просто выводит, что вы хотите someEvent += new EventHandler( Program_someEvent );
- Вы можете видеть, что он создает новый объект EventHandler в обоих случаях в MSIL

Ответ 2

Раньше (.NET 1.x days), что длинная форма была единственным способом сделать это. В обоих случаях вы создаете делегат, чтобы указать на метод Program_someEvent.

Ответ 3

Я не думаю, что есть какая-то разница. Конечно, resharper говорит, что первая строка имеет избыточный код.

Ответ 4

Немного offtopic:

Вы можете создать экземпляр делегата (new EventHandler(MethodName)) и (при необходимости) повторного использования этого экземпляра.

Ответ 5

Не требовалось ли new XYZEventHandler до С# 2003, и вам разрешили пропустить избыточный код на С# 2005?

Ответ 6

Я думаю, что один из способов действительно рассказать - это посмотреть на MSIL, выпущенный для кода. Как правило, это хороший кислотный тест.

У меня есть смешные опасения, что это может каким-то образом испортиться с GC.. Кажется странным, что все бы накладные расходы на объявление нового типа делегата, если вам это не нужно было делать, знаете ли?