次のようなコードが表示されます。
textBox.TextChanged += (s, e) => this.Foo();
しかし、「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
はソース オブジェクトであり、オブジェクトまたは EventArgs クラスから拡張されたオブジェクトです。ラムダ式e
を読み取る必要がありますEventArgs
デリゲートのショートカットとして使用されるラムダ式です。TextChanded は、2 つの引数を取るデリゲートを想定していますobject sender, EventArgs e
。ラムダ バージョンは、これらの引数をプレースホルダーでマークしますs=sender, e=eventargs
。舞台裏で次のように変換されるため、単なる構文糖衣です。
textBox.TextChanged += new EventHandler(delegate (Object s, EventArgs e) {
});
これはラムダ式です。ラムダ式は、メソッド (または正確にはデリゲート) を記述する非常に簡潔な方法です。このようなメソッドを書くことができます
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_TextChanged
object 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));
探しているトピックは式ラムダと呼ばれます。
s
とe
は、 の後に本体が示される無名関数のパラメーターの名前です=>
。
S は通常、送信者 (イベントを呼び出したオブジェクト) になり、e はイベントの引数になります。このスタックオーバーフローの回答はそれを説明する必要があります:
メソッドのパラメーター。例えば :
protected void TextBox_TextChanged(Object Sender, EventArgs Args)