2011-07-26 18 views
15

Perdón por preguntar todo, pero soy un tipo veterano de Vb.net que se está transfiriendo a C#. Tengo el siguiente fragmento de código que parece activarse cuando se activa el (en este caso) método postAsync. Acabo de Don; no entienden lo que el código está haciendo (como sigue): -¿Qué es + = (o, arg) => realmente logrado?

app.PostCompleted += 
    (o, args) => 
    { 
     if (args.Error == null) 
     { 
      MessageBox.Show("Picture posted to wall successfully."); 
     } 
     else 
     { 
      MessageBox.Show(args.Error.Message); 
     } 
    }; 

si alguien puede explicar lo que el + = (O, args) => acheiving es en realidad estaría tan agradecidos .. ..

muchas gracias de antemano. Tim

Respuesta

26

define una expresión lambda que toma dos parámetros llamados o y args. Los tipos de esos parámetros se deducen según el tipo de PostCompleted (si PostCompleted es un EventHandler, entonces serán respectivamente del tipo Object y EventArgs). El cuerpo de la expresión luego sigue al =>.

El resultado es que se agrega como un controlador a PostCompleted.

Como tal, es una forma menos detallada para escribir:

app.PostCompleted += delegate(object o, EventArgs args) 
{ 
    // ... 
}; 

¿Qué es una abreviatura para:

void YourHandler(object o, EventArgs args) 
{ 
    // ... 
} 

// ... 

app.PostCompleted += YourHandler; 
+8

Cuál es, en sí, la abreviatura de 'app.PostCompleted + = new EventHandler (YourHandler);'. – Shibumi

+0

Ni siquiera necesita tener "new EventHandler". El compilador C# es lo suficientemente inteligente como para inferir qué delegado usar. Así que un atajo más corto es 'app.PostCompleted + = YourHandler;' – Sung

+4

@Sung creo que eso es exactamente lo que dijo. –

8

Ese es un controlador adicional para el evento PostCompleted utilizando una expresión lambda. Es similar a

app.PostCompleted += MyHandler; 

    // ... 

    private void MyHandler(object sender, EventArgs e) { 
     // ... 
    } 

Pero al usar expresiones lambda, no puede separar el controlador fácilmente.

5

Es la abreviatura de un delegado que define el controlador de eventos para el evento de perfeccionamiento:

app.PostCompleted += delegate(object o, EventArgs args) { 
    // ... 
}; 

Véase también Anonymous Methods.

3

Suponiendo que PostCompleted es un evento, básicamente está creando un controlador de eventos utilizando la notación lambda.

Este código cortado con tijeras es equivalente a:

app.PostCompleted += delegate (o, args) 
{ 
    if (args.Error == null) 
    { 
     MessageBox.Show("Picture posted to wall successfully."); 
    } 
    else 
    { 
     MessageBox.Show(args.Error.Message); 
    } 
}; 
2

La parte (o,args) => es una lambda expression, que es una función anónima.

la parte += asigna la expresión lambda que se llamará cuando se desate el evento.

+0

Thnaks para el enlace MSDN ..... –

3

El vb.net equivalente sería el siguiente:

AddHandler app.PostCompleted, Function(o, args) 
     ''# ... 
    End Function 

Tenga en cuenta que esto requiere 2010/.Net Visual Studio 4, pero el código C# funciona de nuevo en Visual Studio 2008/Net 3.5.

Pero eso solo es parcialmente cierto. En C#, esta es una forma de definir un método como un controlador de eventos en un solo lugar. En VB.Net, puede utilizar la palabra clave Handles, por lo que el equivalente real puede tener un aspecto de la misma familia:

Public Sub App_PostCompleted(ByVal Sender as Object, ByVall e As EventArgs) Handles app.PostCompleted 
    ''# 
End Sub 

Pero incluso eso no es completamente equivalente, ya que le dio el método un nombre y se puede llamar desde cualquier lugar. La única referencia al código C# (y por lo tanto la única forma de llamarlo) es a través de la suscripción al evento.