我看到一些这样的代码:
textBox.TextChanged += (s, e) => this.Foo();
但我不知道什么是“s”和“e”?对于这行代码,我应该在 C# 中学习什么主题?
我看到一些这样的代码:
textBox.TextChanged += (s, e) => this.Foo();
但我不知道什么是“s”和“e”?对于这行代码,我应该在 C# 中学习什么主题?
它们是 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();
}
s
是源对象,并且e
是应该是EventArgs
对象或从 EventArgs 类扩展的对象,您必须阅读lambda 表达式
是一个 lamda 表达式,用作委托的快捷方式。TextChanded 期望一个代表接受两个参数,object sender, EventArgs e
. lambda 版本用占位符标记这些参数,即s=sender, e=eventargs
. 只是一个语法糖,因为它在幕后转换为:
textBox.TextChanged += new EventHandler(delegate (Object s, EventArgs e) {
});
您要查找的主题称为表达式 lambdas。
s
和e
是匿名函数的参数名称,其主体在 . 之后指示=>
。
S 通常是发送者(调用事件的对象),e 是事件参数。这个stackoverflow答案应该解释它:
方法的参数。例如 :
protected void TextBox_TextChanged(Object Sender, EventArgs Args)
这是一个 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 有对应的参数列表)这些参数的名称无关紧要。
更新:
如果所需的方法(或委托)需要返回值,您可以return
在 lambda 表达式中删除关键字。鉴于这种方法
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));