5

我看到一些这样的代码:

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

但我不知道什么是“s”和“e”?对于这行代码,我应该在 C# 中学习什么主题?

4

7 回答 7

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

s是源对象,并且e是应该是EventArgs对象或从 EventArgs 类扩展的对象,您必须阅读lambda 表达式

于 2012-09-21T14:58:48.567 回答
2

是一个 lamda 表达式,用作委托的快捷方式。TextChanded 期望一个代表接受两个参数,object sender, EventArgs e. lambda 版本用占位符标记这些参数,即s=sender, e=eventargs. 只是一个语法糖,因为它在幕后转换为:

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

            });
于 2012-09-21T15:00:16.117 回答
1

您要查找的主题称为表达式 lambdas

se是匿名函数的参数名称,其主体在 . 之后指示=>

于 2012-09-21T15:00:13.870 回答
1

S 通常是发送者(调用事件的对象),e 是事件参数。这个stackoverflow答案应该解释它:

用于 lambda 的弱事件处理程序模型

于 2012-09-21T15:00:59.780 回答
1

方法的参数。例如 :

protected void TextBox_TextChanged(Object Sender, EventArgs Args)
于 2012-09-21T15:01:20.000 回答
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# 编译器自动推断。se是参数并且等价于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));
于 2012-09-21T15:08:14.113 回答