2012-09-21 13 views
5

の「S」と「e」のものです私はこのようないくつかのコードを参照してください。C#コードの構文

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

を私は「S」と「E」が何であるか分からないのですか?このコード行のC#で勉強すべき話題は何ですか?

+0

ソースとのEventArgs –

+0

のためだけの変数名を作ることができ、彼らはタイプ識別子なしに、自分の上に立っている理由は、コンパイラはイベントハンドラからその使用法を推測することができるので、明示的に '(オブジェクト送信者、TextChangedEventArgs e)'(タイプには不明で、ちょうど推測する)の –

答えて

14

を読まなければなりません。

コンパイラが文脈からその型を推測、長い(より多くの情報)のフォームを書き込むことが許可されている。この表記で

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

彼らがメソッドのパラメータであることを確認するために簡単です。
=>の反対側はメソッド本体です。応答で


はコメントする:

今もシンプルなC#構文では、私が持っている同じラムダ式を書き換える方法はありますか?

はい、いつもの表記を使用できます。そしてそれが「より良い」または「より単純」ではないかもしれないが、あなたがこれを学んだときに理解することはより容易である。

// 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

をGoogleに紹介する必要はありません"ラムダ式" ...今は、同じシンプルなC#synと同じラムダ式を書き直す方法があります税金?ラムダ式がまったくない。 – Bohn

+0

@BDotA "シンプル"は主観的です。ほとんどの人はラムダをこれを行う最も簡単な方法だと考えています。 – Servy

+0

@Servy - そうですが、これを学ぶとしばらくの間、イベントハンドラとラムダを分ける方が簡単です。 BdotA:編集を参照してください。 –

4

sは、ソースオブジェクトであるとeEventArgsオブジェクトまたはEventArgsのクラスから拡張されるべき対象である、あなたは彼らがラムダ関数のパラメータですlambda expression

1

あなたが探しているトピックは、expression lambdasと呼ばれています。

sおよびeは、本文が=>の後に示される無名関数のパラメータの名前です。

2

lamda式は、デリゲートのショートカットとして使用されます。 TextChandedは、2つの引数、つまりobject sender, EventArgs eを受け取るデリゲートを想定しています。ラムダバージョンでは、これらの引数にプレースホルダ、つまりs=sender, e=eventargsが付けられます。

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

      }); 
+0

ok cool、これは古い構文です...今、lambdaがやっていることが何であったのか理解できます。 – Bohn

+1

@BDotAはい、よりシンテチックな方法です(読みやすく、使い慣れているだけです) –

1

Sは通常、eはイベント引数になります送信者(イベント呼び出されたオブジェクト)になるだろう:シーンの後ろにそれが変換されるためだけ糖衣構文です。このstackoverflowの答えは、それを説明する必要があります:メソッドの

Weak event handler model for use with lambdas

1

パラメータを。

protected void TextBox_TextChanged(Object Sender, EventArgs Args) 
1

これはラムダ式です。ラムダ式は、メソッド(または正確なデリゲート)を作成するための非常に簡潔な方法です。あなたはまた、書くことができ、この

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

のようなメソッドを記述し、その後

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

には相当します。この

textBox.TextChanged += TextBox_TextChanged; 

のようにハンドラを追加することができ

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

しかし、arguの種類C#コンパイラによって自動的に推論されます。 sおよびはパラメタであり、TextBox_TextChangedメソッドのパラメタに相当します。object sender, EventArgs e。それらは=>の後の式で使用できます。これらのパラメータの名前は重要ではありません を(fooが対応するパラメータのリストを持っていると仮定)

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


UPDATE:必要なメソッド(または代理人)は、戻り値が必要な場合は

は、あなたはラムダ式でreturnキーワードをドロップすることができます。この方法

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

を考えると、あなただけ与えられた答えに追加するには、これらの呼び出し

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