2009-12-27 3 views
5

Je joue avec HttpWebRequest s ces derniers temps, et dans les tutoriels qu'ils font toujours:C# nouveau [délégué] n'est pas nécessaire?

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

Mais new AsyncCallback ne semble pas être necesary. Si UpdateItem a la bonne signature, alors il ne semble pas y avoir de problème. Alors pourquoi les gens l'incluent-ils? Est-ce que ça fait quelque chose?

+0

Je n'utilise pas normalement 'new DelegateType (...)', j'aimerais aussi savoir si cela fait quoi que ce soit. MSDN n'en parle pas vraiment ici: http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx –

+0

duplication possible de [C#: Différence entre '+ = anEvent' et '+ = new EventHandler (anEvent)'] (http://stackoverflow.com/questions/550703/c-difference-between-anevent-and-new-eventhandleranevent) – nawfal

Répondre

12

C'est la même chose, la plupart du temps (il y a quelques règles de surcharge à penser, 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 délégué. Ainsi, le tutoriel était (a) écrit avant que l'inférence de type délégué soit disponible, ou (b) ils voulaient être verbeux à des fins d'explication.

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

// 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(); }); 
2

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

public delegate void AsyncCallback(IAsyncResult ar); 

Lorsque vous passez le nom de la méthode elle-même tant que la signature correspond au compilateur remplacera généralement le code pour vous, son raccourci juste.

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

request.BeginGetResponse(TestMethod, null); 

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

Le code compilé ressemblera à ceci.

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

Pour être complet, cela change entre C# 1.2 (avec .NET 1.1) et C# 2.0 (avec. NET 2.0). À partir de la version 2.0, vous pouvez donc omettre le new SomeDelegateType(...) dans la plupart des scénarios. Bizarrement, l'outillage n'a pas changé, donc dans l'EDI si vous tapez someObj.SomeEvent += l'EDI va suggérer (via l'l'ongletl'onglet) la version complète incluant le type de délégué.