Différence entre les événements de câblage avec et sans « nouveau »
Question
En C#, quelle est la différence (le cas échéant) entre ces deux lignes de code ?
tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);
et
tmrMain.Elapsed += tmrMain_Tick;
Les deux semblent fonctionner exactement de la même manière.C# suppose-t-il simplement que vous parlez du premier lorsque vous tapez le second ?
La solution
j'ai fait ça
static void Hook1()
{
someEvent += new EventHandler( Program_someEvent );
}
static void Hook2()
{
someEvent += Program_someEvent;
}
Et puis j'ai parcouru le code avec ildasme.
Le MSIL généré était exactement le même.
Donc pour répondre à votre question, oui, c'est la même chose.
Le compilateur déduit simplement que vous voulez someEvent += new EventHandler( Program_someEvent );
-- Vous pouvez le voir créer le nouveau EventHandler
objet dans les deux cas dans le MSIL
Autres conseils
Autrefois (jours .NET 1.x), le formulaire long était le seul moyen de le faire.Dans les deux cas, vous créez un délégué pour pointer vers la méthode Program_someEvent.
Je ne pense pas qu'il y ait de différence.Resharper dit certainement que la première ligne contient du code redondant.
Un petit hors sujet :
Vous pouvez instancier un délégué (new EventHandler(MethodName))
et (le cas échéant) réutiliser cette instance.
N'était-ce pas le new XYZEventHandler
require jusqu'en C#2003, et vous étiez autorisé à omettre le code redondant en C#2005 ?
Je pense que la seule façon de vraiment le savoir serait de regarder le MSIL produit pour le code.Cela a tendance à être un bon test d’acidité.
J'ai de drôles d'inquiétudes quant au fait que cela puisse gâcher GC.Cela semble étrange qu'il y ait toute la surcharge liée à la déclaration du nouveau type de délégué si cela n'avait jamais besoin d'être fait de cette façon, vous savez ?