Diferença entre eventos de ligação com e sem “novo”
Pergunta
Em C#, qual é a diferença (se houver) entre essas duas linhas de código?
tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);
e
tmrMain.Elapsed += tmrMain_Tick;
Ambos parecem funcionar exatamente da mesma forma.O C# apenas assume que você quer dizer o primeiro quando digita o último?
Solução
eu fiz isso
static void Hook1()
{
someEvent += new EventHandler( Program_someEvent );
}
static void Hook2()
{
someEvent += Program_someEvent;
}
E então executei o ildasm no código.
O MSIL gerado foi exatamente o mesmo.
Então, para responder à sua pergunta, sim, eles são a mesma coisa.
O compilador está apenas inferindo que você deseja someEvent += new EventHandler( Program_someEvent );
- Você pode ver isso criando o novo EventHandler
objeto em ambos os casos no MSIL
Outras dicas
Antigamente (.NET 1.x dias) o formato longo era a única maneira de fazer isso.Em ambos os casos, você está criando um delegado para apontar para o método Program_someEvent.
Eu não acho que haja alguma diferença.Certamente o resharper diz que a primeira linha possui código redundante.
Um pouco offtopic:
Você poderia instanciar um delegado (new EventHandler(MethodName))
e (se apropriado) reutilizar essa instância.
Não foi o new XYZEventHandler
require até C#2003 e você tinha permissão para omitir o código redundante em C#2005?
Acho que a única maneira de saber realmente seria observar o MSIL produzido para o código.Tende a ser um bom teste ácido.
Tenho preocupações engraçadas de que isso possa de alguma forma atrapalhar o GC.Parece estranho que haveria toda a sobrecarga de declarar o novo tipo de delegado se isso nunca precisasse ser feito dessa maneira, sabe?