2012-09-21 7 views
5

que ver algo de código como esto:lo son "s" y "e" en C# código de sintaxis

textBox.TextChanged += (s, e) => this.Foo(); 

pero no saben lo que son "s" y "e"? ¿Cuál es el tema que debería estudiar en C# para esta línea de código?

+0

sólo un nombre variable para Fuente y EventArgs –

+0

sólo para añadir a las respuestas dadas, la razón por la que están de pie por su cuenta sin identificadores de tipo es porque el compilador puede deducir su uso del controlador de eventos, por lo que no es necesario indicar explícitamente '(remitente del objeto, TextChangedEventArgs e)' (no estoy seguro de los tipos, simplemente adivinando) –

Respuesta

14

Son los parámetros de la función lambda.

El compilador infiere sus tipos a partir del contexto, pero se permite escribir una forma más larga (más informativo):

textBox.TextChanged += (object s, EventArgs e) => { this.Foo(); }; 

En esta notación es más fácil de ver que son los parámetros del método.
En el otro lado de => es el cuerpo del método.


En respuesta al comentario:

Ahora hay una manera de volver a escribir también la misma expresión lambda que tengo en una sintaxis más simple # C?

Sí, siempre puede usar la notación clásica. Y aunque eso puede no ser "mejor" o incluso "más simple", es más fácil de entender cuando estás aprendiendo esto.

// The setup method 
void MyMethod() 
{ 
    //textBox.TextChanged += new Eventhandler(MyTextChangedHandler); // C#1 and later 
    textBox.TextChanged += MyTextChangedHandler;      // C#2 and later 
} 

// The subscribed method. The lambda is an inline version of this. 
private void MyTextChangedHandler(object s, EventArgs e) 
{ 
    this.Foo(); 
} 
+0

gracias, por lo que la palabra clave Google para mí es aprender "Lambda Expression" ... Ahora hay una manera de reescribir la misma expresión lambda que tengo en una sintaxis C# más simple ¿impuesto? bien sin expresiones Lambda. – Bohn

+0

@BDotA "más simple" es subjetivo. La mayoría de las personas considera que lambdas es la forma más sencilla de hacerlo. – Servy

+0

@Servy - Sí, pero al aprender esto, es más fácil separar eventhandlers y lambdas por un tiempo. BdotA: ver edición. –

4

s es objeto de origen y es e objeto que debe ser objeto EventArgs o extendida de la clase EventArgs, Tienes que leer lambda expression

1

El tema que busca se llama expression lambdas.

s y e son nombres de parámetros de una función anónima cuyo cuerpo se indica después del =>.

2

Es una expresión lamda utilizada como atajo para un delegado. TextChanded espera que un delegado tome dos argumentos, object sender, EventArgs e. La versión lambda marca estos argumentos con marcadores de posición, es decir, s=sender, e=eventargs. Es sólo un azúcar sintáctico desde detrás de la escena se convierte en:

textBox.TextChanged += new EventHandler(delegate (Object s, EventArgs e) { 

      }); 
+0

ok cool, ahora esta es la sintaxis más antigua ... ahora puedo entender qué diablos estaba haciendo esa cosa lambda. – Bohn

+1

@BDotA sí, es una forma más sintetizada (y fácil de leer, solo necesita acostumbrarse) –

1

parámetros del método. por ejemplo:

protected void TextBox_TextChanged(Object Sender, EventArgs Args) 
1

Esta es una expresión lambda. Una expresión lambda es una forma muy concisa de escribir un método (o un delegado para ser precisos).Se puede escribir un método como este

private void TextBox_TextChanged(object sender, EventArgs e) 
{ 
    this.Foo(); 
} 

y luego agregar el controlador como este

textBox.TextChanged += TextBox_TextChanged; 

sería equivalente a

textBox.TextChanged += (s, e) => this.Foo(); 

También podría escribir

textBox.TextChanged += (object s, EventArgs e) => this.Foo(); 

pero los tipos de la discusión Los datos se deducen automáticamente por el compilador C#. s y e son los parámetros y son equivalentes a los parámetros del método TextBox_TextChanged: object sender, EventArgs e. Podrían usarse en la expresión siguiente al =>.

textBox.TextChanged += (s, e) => this.Foo(s, e); 

(suponiendo Foo tiene una lista de parámetros correspondiente) El nombre de estos parámetros no importa.


ACTUALIZACIÓN:

Si el método requerido (o su delegado) requiere un valor de retorno, se puede eliminar la palabra clave return en la expresión lambda. Teniendo en cuenta este método

public void WriteValues(Func<double, double> f) 
{ 
    for (int i = 0; i <= 10; i++) { 
     Console.WriteLine("f({0}) = {1}", i, f(i)); 
    } 
} 

puede hacer estas llamadas

WriteValues(x => x * x); 
WriteValues(x => Math.Sin(x)); 
WriteValues(t => Math.Exp(-t)); 
Cuestiones relacionadas