2009-12-27 17 views
5

He estado jugando con HttpWebRequest s últimamente, y en los tutoriales que siempre hacen:C# new [delegate] no es necesario?

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

Pero new AsyncCallback parece que no seria necesario. Si UpdateItem tiene la firma correcta, entonces no parece haber un problema. Entonces, ¿por qué la gente lo incluye? ¿Hace algo?

+0

Normalmente no uso 'nuevo DelegateType (...)', también me gustaría saber si eso hace algo. MSDN realmente no habla de ello aquí: http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx –

+0

posible duplicado de [C#: diferencia entre '+ = un evento' y '+ = new EventHandler (anEvent)'] (http://stackoverflow.com/questions/550703/c-difference-between-anevent-and-new-eventhandleranevent) – nawfal

Respuesta

12

Es lo mismo, en su mayoría (hay algunas reglas de sobrecarga en las que pensar, aunque no en este sencillo ejemplo). Pero en versiones anteriores de C#, no hubo ninguna inferencia de tipo de delegado. Por lo tanto, el tutorial era (a) escrito antes de que la inferencia del tipo de delegado estuviera disponible, o (b) querían ser detallados para fines de explicación.

He aquí un resumen de algunas de las diferentes formas que puede tomar ventaja de tipo de delegado inferencia:

// 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 es sólo un delegado en C#, se ha declarado como

public delegate void AsyncCallback(IAsyncResult ar); 

Cuando se pasa el propio nombre del método, siempre y cuando la firma coincide con el compilador generalmente sustituir el código para usted, es sólo de acceso directo.

Simplemente puede marcar esto usando Reflector. Si tienes esto, por ejemplo.

request.BeginGetResponse(TestMethod, null); 

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

El código compilado en realidad tener este aspecto.

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

Para completar, esto cambia entre C# 1.2 (con .NET 1.1) y C# 2.0 (con. NET 2.0). Por lo tanto, a partir de 2.0 puede omitir el new SomeDelegateType(...) en la mayoría de los escenarios. Curiosamente, la herramienta no ha cambiado, por lo que en el IDE si escribe someObj.SomeEvent +=, el IDE sugerirá (a través de , pestaña, pestaña) la versión completa incluyendo el tipo de delegado.