Разница между событиями подключения с надписью “new” и без нее

StackOverflow https://stackoverflow.com/questions/26877

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top