Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是「;s";及;";在C#代码语法中_C# - Fatal编程技术网

什么是「;s";及;";在C#代码语法中

什么是「;s";及;";在C#代码语法中,c#,C#,我看到一些代码如下: textBox.TextChanged += (s, e) => this.Foo(); 但我不知道什么是“s”和“e”?对于这行代码,我应该在C#中学习什么主题?s是源对象,e是应该是EventArgs对象或从EventArgs类扩展的对象,您必须阅读它们是lambda函数的参数 编译器根据上下文推断其类型,但允许编写更长(信息量更大)的表单: 在这种表示法中,更容易看出它们是方法参数。 =>的另一侧是方法主体 针对评论: 现在有没有一种方法可以用更简单的C#语

我看到一些代码如下:

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

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

s
是源对象,
e
是应该是
EventArgs
对象或从EventArgs类扩展的对象,您必须阅读它们是lambda函数的参数

编译器根据上下文推断其类型,但允许编写更长(信息量更大)的表单:

在这种表示法中,更容易看出它们是方法参数。
=>
的另一侧是方法主体


针对评论:

现在有没有一种方法可以用更简单的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
是匿名函数的参数名称,其主体在
=>

之后指示,是用作委托快捷方式的lamda表达式。
textBox.TextChanged += (s, e) => this.Foo(s, e);
TextChanded期望委托接受两个参数,
对象发送方,EventArgs e
。lambda版本使用占位符标记这些参数,即
s=sender,e=eventargs
。只是一个语法糖,因为它在幕后转换为:

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

            });

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


方法的参数。例如:

protected void TextBox_TextChanged(Object Sender, EventArgs Args)

这是一个lambda表达式。lambda表达式是编写方法(确切地说是委托)的一种非常简洁的方式。您可以编写这样的方法

private void TextBox_TextChanged(object sender, EventArgs e)
{
    this.Foo();
}
textBox.TextChanged += TextBox_TextChanged;
然后像这样添加处理程序

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\u TextChanged
方法的参数等效:
对象发送者,事件参数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));
    }
}

只是源和事件args的一个变量名必须添加到给定的答案中,因为编译器可以从事件处理程序推断它们的用法,所以没有必要显式声明
(objectsender,TextChangedEventArgs e)
(不确定类型,只是猜测)谢谢,所以谷歌对我来说的关键词是学习“Lambda表达式”…现在有没有一种方法可以用更简单的C#语法重写相同的Lambda表达式?没有Lambda表达式,@BDotA“simpler”是主观的。大多数人认为LAMBDAS是最简单的方法。@ Servy——是的,但是在学习这一点的时候,更容易把Evestand和Labbdas分开一段时间。BdotA:请参见编辑。好的,很酷,现在这是较旧的语法…现在我可以理解lambda的作用了。@BdotA是的,是一种更简洁的方式(而且更容易阅读,只需要习惯它)