Во всех примерах я могу найти, а также автоматически сгенерированный код i Visual Studio, события установлены с помощью следующего кода:
button1.Click += new System.EventHandler(this.button1_Click);
Но я могу также записать это визуально более чистый путем исключения обертки конструктора:
button1.Click += this.button1_Click;
Которые также компилируют прекрасный.
Каково различие между этими двумя? И почему первый, главным образом использовал/предпочитал?
Вторая форма (неявное преобразование из группы методов в тип делегата) не поддерживалась до C# 2, поэтому все учебники и т.д., написанные до 2005 года, использовали первую форму.
Кроме того, IIRC Visual Studio автоматически заполняет первую форму. Лично я предпочитаю вторую.
Вторая форма - это синтаксический сахар, который расширяется до первой формы с помощью магии компилятора.
Первый вариант может быть предпочтительнее, потому что тип события не скрыт в коде, и, следовательно, его легче читать в дальнейшем, но функционально (и с точки зрения IL) они одинаковы.
Именно удаление обработчиков событий вдохновило на сахар:
button1.Click -= new System.EventHandler(this.button1_Click);
Использование new для удаления обработчика событий? Да.
Даже полный синтаксис конструктора делегата - это сахар. Делегату нужен метод и цель. Цель назначается автоматически, без вашего указания. Это будет "this". Немного жаль, но это скрывает тот факт, что подписка на событие добавляет ссылку на объект вашего класса, что может уберечь его от сборки мусора. Это явно выражено в синтаксисе C++/CLI:
button1->Click += gcnew System::EventHandler(this, &button1_Click);
с тем интересным поворотом, что вы можете подписаться на метод обработки события другого объекта или класса. Не то чтобы это часто использовалось.