2012-09-21 11 views
5

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?

+0

solo un nome variabile per Source e EventArgs –

+0

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) –

risposta

14

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(); 
} 
+0

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

+0

@BDotA "più semplice" è soggettivo. La maggior parte delle persone ritiene che lambda sia il modo più semplice per farlo. – Servy

+0

@Servy - Sì, ma quando si apprende questo è più facile separare eventhandlers e lambda per un po '. BdotA: vedi modifica. –

4

s è oggetto di origine e e è oggetto che dovrebbe essere EventArgs oggetto o estesa dalla classe EventArgs, Devi leggere lambda expression

1

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 =>.

2

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) { 

      }); 
+0

ok, adesso questa è la sintassi più vecchia ... ora capisco che diamine è stata quella cosa lambda. – Bohn

+1

@BDotA sì, è un modo più sintetico (e più facile da leggere, basta abituarsi) –

1

parametri del metodo. ad esempio:

protected void TextBox_TextChanged(Object Sender, EventArgs Args) 
1

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)); 
Problemi correlati