vedo qualche codice come questo:quali sono "s" e "e" in C# codice sintassi
textBox.TextChanged += (s, e) => this.Foo();
ma non so che cosa sono "s" e "E"? qual è l'argomento che dovrei studiare in C# per questa linea di codice?
vedo qualche codice come questo:quali sono "s" e "e" in C# codice sintassi
textBox.TextChanged += (s, e) => this.Foo();
ma non so che cosa sono "s" e "E"? qual è l'argomento che dovrei studiare in C# per questa linea di codice?
Sono i parametri della lambda-funzioni.
Il compilatore deduce loro tipi dal contesto, ma si è permesso di scrivere una forma più lunga (più informativo):
textBox.TextChanged += (object s, EventArgs e) => { this.Foo(); };
In questa notazione è più facile vedere che sono i parametri del metodo.
Dall'altro lato di =>
è il corpo del metodo.
In risposta a commentare:
Ora c'è un modo per riscrivere anche la stessa espressione lambda che ho in un C# sintassi più semplice?
Sì, è sempre possibile utilizzare la notazione classica. E mentre ciò potrebbe non essere "migliore" o addirittura "più semplice", è più facile capire quando lo stai imparando.
// 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();
}
grazie, quindi la parola chiave a Google per me è imparare "Espressione Lambda" ... Ora c'è un modo per riscrivere anche la stessa espressione lambda che ho in un C# syn più semplice imposta? bene senza espressioni Lambda. – Bohn
@BDotA "più semplice" è soggettivo. La maggior parte delle persone ritiene che lambda sia il modo più semplice per farlo. – Servy
@Servy - Sì, ma quando si apprende questo è più facile separare eventhandlers e lambda per un po '. BdotA: vedi modifica. –
s
è oggetto di origine e e
è oggetto che dovrebbe essere EventArgs
oggetto o estesa dalla classe EventArgs, Devi leggere lambda expression
L'argomento che stai cercando è chiamato expression lambdas.
s
e e
sono i nomi dei parametri di una funzione anonima il cui corpo è indicato dopo lo =>
.
Espressione di lamda utilizzata come scorciatoia per un delegato. TextChanded si aspetta che un delegato prenda due argomenti, object sender, EventArgs e
. La versione lambda contrassegna questi argomenti con i segnaposto, ovvero s=sender, e=eventargs
. È solo una zucchero sintattico dal dietro le quinte lo converte in:
textBox.TextChanged += new EventHandler(delegate (Object s, EventArgs e) {
});
ok, adesso questa è la sintassi più vecchia ... ora capisco che diamine è stata quella cosa lambda. – Bohn
@BDotA sì, è un modo più sintetico (e più facile da leggere, basta abituarsi) –
S è di solito sta per essere il mittente (oggetto che ha richiamato l'evento) ed e saranno gli argomenti dell'evento. Questa risposta StackOverflow dovrebbe spiegarlo:
parametri del metodo. ad esempio:
protected void TextBox_TextChanged(Object Sender, EventArgs Args)
Questa è un'espressione lambda. Un'espressione lambda è un modo molto conciso di scrivere un metodo (o un delegato per essere precisi).Si potrebbe scrivere un metodo come questo
private void TextBox_TextChanged(object sender, EventArgs e)
{
this.Foo();
}
e quindi aggiungere il gestore come questo
textBox.TextChanged += TextBox_TextChanged;
sarebbe equivalente a
textBox.TextChanged += (s, e) => this.Foo();
Si potrebbe anche scrivere
textBox.TextChanged += (object s, EventArgs e) => this.Foo();
ma i tipi di argu I ments sono dedotti automaticamente dal compilatore C#. s
e e
sono i parametri e sono equivalenti ai parametri del metodo TextBox_TextChanged
: object sender, EventArgs e
. Potrebbero essere utilizzati nell'espressione seguente allo =>
.
textBox.TextChanged += (s, e) => this.Foo(s, e);
(supponendo Foo ha un elenco corrispondente parametro) Il nome di questi parametri non importa.
UPDATE:
Se il metodo desiderato (o delegato) richiede un valore di ritorno, si può cadere la parola chiave return
nell'espressione lambda. Dato questo metodo
public void WriteValues(Func<double, double> f)
{
for (int i = 0; i <= 10; i++) {
Console.WriteLine("f({0}) = {1}", i, f(i));
}
}
è possibile effettuare queste chiamate
WriteValues(x => x * x);
WriteValues(x => Math.Sin(x));
WriteValues(t => Math.Exp(-t));
solo un nome variabile per Source e EventArgs –
solo aggiungere alle risposte date, la ragione per cui sono in piedi da soli, senza di tipo identificatori è perché il compilatore può dedurre il loro utilizzo dal gestore di eventi, quindi non è necessario dichiarare esplicitamente '(oggetto mittente, TextChangedEventArgs e)' (non sono sicuro sui tipi, solo indovinando) –