の「S」と「e」のものです私はこのようないくつかのコードを参照してください。C#コードの構文
textBox.TextChanged += (s, e) => this.Foo();
を私は「S」と「E」が何であるか分からないのですか?このコード行のC#で勉強すべき話題は何ですか?
の「S」と「e」のものです私はこのようないくつかのコードを参照してください。C#コードの構文
textBox.TextChanged += (s, e) => this.Foo();
を私は「S」と「E」が何であるか分からないのですか?このコード行のC#で勉強すべき話題は何ですか?
を読まなければなりません。
コンパイラが文脈からその型を推測、長い(より多くの情報)のフォームを書き込むことが許可されている。この表記で
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();
}
s
は、ソースオブジェクトであるとe
がEventArgs
オブジェクトまたはEventArgsのクラスから拡張されるべき対象である、あなたは彼らがラムダ関数のパラメータですlambda expression
あなたが探しているトピックは、expression lambdasと呼ばれています。
s
およびe
は、本文が=>
の後に示される無名関数のパラメータの名前です。
lamda式は、デリゲートのショートカットとして使用されます。 TextChandedは、2つの引数、つまりobject sender, EventArgs e
を受け取るデリゲートを想定しています。ラムダバージョンでは、これらの引数にプレースホルダ、つまりs=sender, e=eventargs
が付けられます。
textBox.TextChanged += new EventHandler(delegate (Object s, EventArgs e) {
});
ok cool、これは古い構文です...今、lambdaがやっていることが何であったのか理解できます。 – Bohn
@BDotAはい、よりシンテチックな方法です(読みやすく、使い慣れているだけです) –
Sは通常、eはイベント引数になります送信者(イベント呼び出されたオブジェクト)になるだろう:シーンの後ろにそれが変換されるためだけ糖衣構文です。このstackoverflowの答えは、それを説明する必要があります:メソッドの
パラメータを。
protected void TextBox_TextChanged(Object Sender, EventArgs Args)
これはラムダ式です。ラムダ式は、メソッド(または正確なデリゲート)を作成するための非常に簡潔な方法です。あなたはまた、書くことができ、この
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));
ソースとのEventArgs –
のためだけの変数名を作ることができ、彼らはタイプ識別子なしに、自分の上に立っている理由は、コンパイラはイベントハンドラからその使用法を推測することができるので、明示的に '(オブジェクト送信者、TextChangedEventArgs e)'(タイプには不明で、ちょうど推測する)の –