Разница между событиями проводки с и без "новых"
В С# какая разница (если есть) между этими двумя строками кода?
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.. Кажется странным, что все бы накладные расходы на объявление нового типа делегата, если вам это не нужно было делать, знаете ли?