4 votes

C# nouveau [délégué] non nécessaire ?

J'ai joué avec HttpWebRequest ces derniers temps, et dans les tutoriels, ils le font toujours :

IAsyncResult result = request.BeginGetResponse(
  new AsyncCallback(UpdateItem),state);

Mais new AsyncCallback ne semble pas être nécessaire. Si UpdateItem a la bonne signature, alors il ne semble pas y avoir de problème. Alors pourquoi les gens l'incluent-ils ? A-t-il un effet quelconque ?

11voto

John Feminella Points 116878

C'est la même chose, en gros (il y a quelques règles de surcharge à prendre en compte, mais pas dans cet exemple simple). Mais dans les versions précédentes de C#, il n'y avait pas d'inférence de type de délégué. Le tutoriel a donc été soit (a) écrit avant que l'inférence de type de délégué ne soit disponible, soit (b) il a voulu être verbeux à des fins d'explication.

Voici un résumé de quelques-unes des différentes façons dont vous pouvez tirer parti de l'inférence de type délégué :

// Old-school style.
Chef(new CookingInstructions(MakeThreeCourseMeal));

// Explicitly make an anonymous delegate.
Chef(delegate { MakeThreeCourseMeal });

// Implicitly make an anonymous delegate.
Chef(MakeThreeCourseMeal);

// Lambda.
Chef(() => MakeThreeCourseMeal());

// Lambda with explicit block.
Chef(() => { AssembleIngredients(); MakeThreeCourseMeal(); AnnounceDinnerServed(); });

2voto

Stan R. Points 8967

AsyncCallback est juste un délégué en C#, il est déclaré en tant que

public delegate void AsyncCallback(IAsyncResult ar);

Lorsque vous passez le nom de la méthode elle-même, tant que la signature correspond, le compilateur substitue généralement le code pour vous, c'est juste un raccourci.

Vous pouvez simplement vérifier cela en utilisant Réflecteur . Si vous avez ceci par exemple.

request.BeginGetResponse(TestMethod, null);

 static void (IAsyncResult r)
        {
           //do something
        }

Le code compilé ressemblera en fait à ceci.

   request.BeginGetResponse(new AsyncCallback(Test), null);

2voto

Marc Gravell Points 482669

Pour être complet, cela change entre C# 1.2 (avec .NET 1.1) et C# 2.0 (avec .NET 2.0). Ainsi, à partir de la version 2.0, vous pouvez effectivement omettre l'élément new SomeDelegateType(...) dans la plupart des scénarios. Curieusement, l'outillage n'a pas changé, donc dans l'IDE si vous tapez someObj.SomeEvent += l'IDE suggérera (via tab tab ) la version complète incluant le type de délégué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X