【问题标题】:what are "s" and "e" in C# code syntaxC#代码语法中的“s”和“e”是什么
【发布时间】:2012-09-14 00:34:46
【问题描述】:

我看到一些这样的代码:

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

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

【问题讨论】:

  • 只是 Source 和 EventArgs 的变量名
  • 只是为了补充给出的答案,它们在没有类型标识符的情况下独立存在的原因是因为编译器可以从事件处理程序中推断出它们的用法,因此没有必要明确声明 (object sender, TextChangedEventArgs e) (不确定类型,只是猜测)

标签: c#


【解决方案1】:

它们是 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(); 
}

【讨论】:

  • 谢谢,所以对我来说谷歌的关键词是学习“Lambda 表达式”......现在有没有办法用更简单的 C# 语法重写我拥有的相同 lambda 表达式?没有 Lambda 表达式。
  • @BDotA “更简单”是主观的。大多数人认为 lambdas 是最简单的方法。
  • @Servy - 是的,但是在学习这一点时,将事件处理程序和 lambdas 分开一段时间会更容易。 BdotA:见编辑。
【解决方案2】:

这是一个 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));

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 好酷,现在这是较旧的语法......现在我可以理解那个 lambda 到底在做什么了。
    • @BDotA 是的,是一种更简洁的方式(而且更容易阅读,只需要习惯它)
    【解决方案4】:

    s 是源对象,e 是应该是 EventArgs 对象或从 EventArgs 类扩展的对象,您必须阅读 lambda expression

    【讨论】:

      【解决方案5】:

      方法的参数。例如:

      protected void TextBox_TextChanged(Object Sender, EventArgs Args)
      

      【讨论】:

        【解决方案6】:

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

        Weak event handler model for use with lambdas

        【讨论】:

          【解决方案7】:

          您要查找的主题名为expression lambdas

          se 是匿名函数的参数名称,其主体在=&gt; 之后。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多