C#代码语法中的“s”和“e”是什么

时间:2012-09-21 14:57:38

标签: c#

我看到一些像这样的代码:

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

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

7 个答案:

答案 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

se是匿名函数的参数名称,其正文在=>之后显示。

答案 4 :(得分:1)

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

Weak event handler model for use with lambdas

答案 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#编译器自动推断的。 se是参数,相当于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));