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?
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?
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();
}
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
@BDotA "más simple" es subjetivo. La mayoría de las personas considera que lambdas es la forma más sencilla de hacerlo. – Servy
@Servy - Sí, pero al aprender esto, es más fácil separar eventhandlers y lambdas por un tiempo. BdotA: ver edición. –
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
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 =>
.
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) {
});
ok cool, ahora esta es la sintaxis más antigua ... ahora puedo entender qué diablos estaba haciendo esa cosa lambda. – Bohn
@BDotA sí, es una forma más sintetizada (y fácil de leer, solo necesita acostumbrarse) –
S es por lo general va a ser el remitente (objeto que invoca el evento) ye serán los argumentos del evento. Esta respuesta stackoverflow debe explicarlo:
parámetros del método. por ejemplo:
protected void TextBox_TextChanged(Object Sender, EventArgs Args)
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));
sólo un nombre variable para Fuente y EventArgs –
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) –