5

次のようなコードが表示されます。

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

しかし、「s」と「e」が何であるかわかりませんか?このコード行について、C# で学習すべきトピックは何ですか?

4

7 に答える 7

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(); 
}
于 2012-09-21T14:58:58.533 に答える
4

sはソース オブジェクトであり、オブジェクトまたは EventArgs クラスから拡張されたオブジェクトです。ラムダ式eを読み取る必要がありますEventArgs

于 2012-09-21T14:58:48.567 に答える
2

デリゲートのショートカットとして使用されるラムダ式です。TextChanded は、2 つの引数を取るデリゲートを想定していますobject sender, EventArgs e。ラムダ バージョンは、これらの引数をプレースホルダーでマークしますs=sender, e=eventargs。舞台裏で次のように変換されるため、単なる構文糖衣です。

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

            });
于 2012-09-21T15:00:16.117 に答える
1

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

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

そして、このようにハンドラーを追加します

textBox.TextChanged += TextBox_TextChanged;

それは同等です

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

あなたも書くことができます

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

ただし、引数の型は C# コンパイラによって自動的に推測されます。sとはパラメーターであり、メソッドeのパラメーターと同等です: 。の後の式で使用できます。TextBox_TextChangedobject sender, EventArgs e=>

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

(Foo に対応するパラメーター リストがあると仮定します) これらのパラメーターの名前は重要ではありません。


更新

必要なメソッド (またはデリゲート) が戻り値を必要とする場合は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));
于 2012-09-21T15:08:14.113 に答える
1

探しているトピックは式ラムダと呼ばれます。

seは、 の後に本体が示される無名関数のパラメーターの名前です=>

于 2012-09-21T15:00:13.870 に答える
1

S は通常、送信者 (イベントを呼び出したオブジェクト) になり、e はイベントの引数になります。このスタックオーバーフローの回答はそれを説明する必要があります:

ラムダで使用する弱いイベント ハンドラー モデル

于 2012-09-21T15:00:59.780 に答える
1

メソッドのパラメーター。例えば ​​:

protected void TextBox_TextChanged(Object Sender, EventArgs Args)
于 2012-09-21T15:01:20.000 に答える