C#需要帮助理解奇怪的Lambda构造吗

C#需要帮助理解奇怪的Lambda构造吗,c#,C#,今天我在一个c#项目中遇到了这段代码: 已声明此.Loaded public delegate void RoutedEventHandler(object sender, RoutedEventArgs e); 好的,我们可以添加一个事件处理程序代码,其中包含两个参数,一个是object类型的发送方s,另一个是RoutedEventArgs e。实际分配的是 public bool Focus (); 在我看来,这似乎是一个不带参数,返回布尔值的函数 代码显然是有效的,我想我理解它的作用(

今天我在一个c#项目中遇到了这段代码:

已声明此.Loaded

public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
好的,我们可以添加一个事件处理程序代码,其中包含两个参数,一个是object类型的发送方s,另一个是RoutedEventArgs e。实际分配的是

public bool Focus ();
在我看来,这似乎是一个不带参数,返回布尔值的函数

代码显然是有效的,我想我理解它的作用(如果this.loaded启动,则关注名为“user”的文本框),但为什么该代码有效

Thnx


Armin.

因此,
.Loaded
事件确实提供了两个参数,但不要求在lambda中使用它们。根据代码的格式,可以安全地忽略它们。同样,虽然
Focus()
方法返回一个值,但不需要在任何地方使用它。它不是很具有防御性,而且实现者提供该值很可能是有原因的,但严格来说,从语言的角度来看,它不是必需的。

您没有将
焦点
方法分配给
加载的
委托。
代码实际所做的是将lambda分配给符合委托定义的委托

代码

 this.Loaded += (s, e) => this.user.Focus();
实际上是这方面的简写:

 this.Loaded += new RoutedEventHandler(FocusSomething);
上面代码片段中的
FocusSomething
方法将声明为

public void FocusSomething(object sender, RoutedEventArgs args)
{
    this.user.Focus();
}

您只是“忽略”了
Focus
方法的返回值,但分配给委托的方法有一个void返回类型,并接受2个参数(object和RoutedEventArgs,因此这才是有效的)。

您只是忽略了
Focus()方法返回值,这在C#(如果不需要返回值)Jep中是完全有效的,所以我想。而且,由于忽略参数和忽略返回值一样有趣,所以我声明s和e并忽略它们。那么(取自对象Pascal的匿名函数语法)this.Loaded+=@this.user.Focus()如何<代码>(s,e)
是委托声明的一部分,您不能忽略它们,但是编译器应该仔细检查我是否分配了一个不带任何参数的函数。忽略返回值在C#中是标准的,因为没有“sub”或“procedure”,但忽略了参数?@Nimral您不能忽略函数参数,当调用它或在delegate中订阅时,它将不会编译好的解释谢谢,这改变了我看待给定代码的方式,现在一切都清楚了。尽管如此,如果我打算编写可读代码,请选择您在解释中描述的方式……我在回答中编写的代码有一个速记;您可以这样编写:
this.Loaded+=FocusSomething
public void FocusSomething(object sender, RoutedEventArgs args)
{
    this.user.Focus();
}