c# - C# 需要帮助理解奇怪的 Lambda 构造
问题描述
今天我在ac#项目中遇到了这段代码:
public partial class LoginView : UserControl
{
public LoginView()
{
this.InitializeComponent();
this.Loaded += (s, e) => this.user.Focus();
}
...
}
this.Loaded 被声明
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
好的,所以我们可以添加一个带有两个参数的事件处理程序代码,一个对象类型的 sender 和一个 RoutedEventArgs e。实际分配的是
public bool Focus ();
在我看来,这似乎是一个不带参数并返回布尔值的函数。
代码确实有效,我想我理解它的作用(如果 this.loaded 触发,聚焦一个名为“user”的文本框)但为什么这段代码有效?
谢谢,
阿明。
解决方案
您没有将Focus
方法分配给Loaded
委托。代码实际上在做什么,是将 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 个参数(对象和 RoutedEventArgs,所以这只是有效的)。
推荐阅读
- python - 有没有办法使用 matplotlib 插入具有重复值的系列?
- java - 如何在我的 Android 应用中添加睡眠定时器
- python - Get value from a list using BS4
- python - 在类中创建和声明列表
- c# - C# 在 For 循环中按值更改变量名
- c# - 静态字段没有改变?
- c++ - Linux 中的未知类型名称 uint64_t 和 uint16_t uint8_t
- apache-spark - 对 Spark/Graphx/Pregel 示例程序的停止条件感到困惑,以查找“路径距离”
- nativescript - Nativescript Playground:未捕获的错误消息
- bash - 通过 SSH 访问 codeship 上的 github repo