我看到一些像这样的代码:
textBox.TextChanged += (s, e) => this.Foo();
但我不知道“s”和“e”是什么?我应该在C#中学习这行代码的主题是什么?
答案 0 :(得分:14)
它们是lambda函数的参数。
编译器从上下文中推断出它们的类型,但允许编写更长(更具信息性)的表单:
textBox.TextChanged += (object s, EventArgs e) => { this.Foo(); };
在这种表示法中,更容易看出它们是方法参数
在=>
的另一边是方法体。
回应评论:
现在还有一种方法可以用更简单的C#语法重写相同的lambda表达式吗?
是的,您可以随时使用经典表示法。虽然这可能不是“更好”甚至“更简单”,但是当你学习它时,它会更容易理解。
// 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();
}
答案 1 :(得分:4)
s
是源对象,e
是应该是EventArgs
对象或从EventArgs类扩展的对象,您必须阅读lambda expression
答案 2 :(得分:2)
是否使用lamda表达式作为委托的快捷方式。
TextChanded希望代表采用两个参数object sender, EventArgs e
。 lambda版本使用占位符标记这些参数,即s=sender, e=eventargs
。它只是一个语法糖,因为它转换为后面的场景:
textBox.TextChanged += new EventHandler(delegate (Object s, EventArgs e) {
});
答案 3 :(得分:1)
您要查找的主题称为expression lambdas。
s
和e
是匿名函数的参数名称,其正文在=>
之后显示。
答案 4 :(得分:1)
S通常是发送者(调用事件的对象),e将是事件参数。这个stackoverflow答案应该解释它:
答案 5 :(得分:1)
方法参数。例如:
protected void TextBox_TextChanged(Object Sender, EventArgs Args)
答案 6 :(得分:1)
这是一个lambda表达式。 lambda表达式是编写方法(或精确的委托)的一种非常简洁的方式。你可以写一个像这样的方法
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有相应的参数列表) 这些参数的名称无关紧要。
<强>更新强>:
如果必需的方法(或委托)需要返回值,则可以删除lambda表达式中的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));