Diferencia entre eventos de cableado con y sin “nuevo”
Pregunta
En C#, ¿cuál es la diferencia (si la hay) entre estas dos líneas de código?
tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);
y
tmrMain.Elapsed += tmrMain_Tick;
Ambos parecen funcionar exactamente igual.¿C# simplemente asume que te refieres a lo primero cuando escribes lo segundo?
Solución
hice esto
static void Hook1()
{
someEvent += new EventHandler( Program_someEvent );
}
static void Hook2()
{
someEvent += Program_someEvent;
}
Y luego ejecuté ildasm sobre el código.
El MSIL generado era exactamente el mismo.
Entonces, para responder a tu pregunta, sí, son lo mismo.
El compilador simplemente infiere que quieres someEvent += new EventHandler( Program_someEvent );
-- Puedes verlo creando el nuevo EventHandler
objeto en ambos casos en el MSIL
Otros consejos
Solía ser (.NET 1.x días) que el formato largo era la única forma de hacerlo.En ambos casos, está creando un delegado para que apunte al método Program_someEvent.
No creo que haya ninguna diferencia.Ciertamente, resharper dice que la primera línea tiene código redundante.
Un poco fuera de tema:
Podrías crear una instancia de un delegado (new EventHandler(MethodName))
y (si corresponde) reutilizar esa instancia.
¿No fue el new XYZEventHandler
requería hasta C#2003 y se le permitía omitir el código redundante en C#2005?
Creo que la única forma de saberlo realmente sería observar el MSIL producido para el código.Suele ser una buena prueba de fuego.
Tengo preocupaciones curiosas de que de alguna manera pueda afectar a GC.Parece extraño que haya toda la sobrecarga de declarar el nuevo tipo de delegado si nunca fuera necesario hacerlo de esta manera, ¿sabes?