Разница между событиями подключения с надписью “new” и без нее
Вопрос
В C #, в чем разница (если таковая имеется) между этими двумя строками кода?
tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);
и
tmrMain.Elapsed += tmrMain_Tick;
Похоже, что оба они работают совершенно одинаково.Неужели C # просто предполагает, что вы имеете в виду первое, когда вводите второе?
Решение
Я сделал это
static void Hook1()
{
someEvent += new EventHandler( Program_someEvent );
}
static void Hook2()
{
someEvent += Program_someEvent;
}
А затем запустил ildasm над кодом.
Сгенерированный MSIL был точно таким же.
Итак, чтобы ответить на ваш вопрос, да, это одно и то же.
Компилятор просто делает вывод, что вы хотите someEvent += new EventHandler( Program_someEvent );
-- Вы можете видеть, как это создает новый EventHandler
объект в обоих случаях находится в MSIL
Другие советы
Раньше (дни .NET 1.x) длинная форма была единственным способом сделать это.В обоих случаях вы заново создаете делегат, указывающий на метод Program_someEvent.
Я не думаю, что есть какая-то разница.Конечно, resharper говорит, что первая строка содержит избыточный код.
Немного оффтопик :
Вы могли бы создать экземпляр делегата (new EventHandler(MethodName))
и (при необходимости) повторно используйте этот экземпляр.
Это был не тот new XYZEventHandler
требовать до C # 2003, и вам было разрешено опустить избыточный код в C # 2005?
Я думаю, что единственный способ действительно определить это - посмотреть на MSIL, созданный для кода..Как правило, это хороший кислотный тест..
У меня есть забавные опасения, что это может каким-то образом повлиять на GC..Кажется странным, что были бы все накладные расходы на объявление нового типа делегата, если бы это никогда не нужно было делать таким образом, понимаете?