首页 > 解决方案 > 不知道这个 c# 事件处理与 lambdas 是如何工作的,有人可以向我解释一下吗?

问题描述

我正在寻找一种将 vb 事件处理转换为 c# 的方法,因为我正在实现某些东西,并且在阅读了这篇文章(如何从 C# 中的匿名事件处理程序转换为 VB.Net)之后,我尝试复制 lambda 结构,并且不知何故,它起作用了,但我不知道。它是怎么做的,有人可以给我解释一下吗?或者至少引导我到一个教程的链接或帮助我理解这里发生了什么的东西......我的意思是,我可以摆脱这个,因为它,不知何故,工作,但我想了解发生了什么不仅仅是“完成工作”。

Class.Event += Class.Delegate((sometext)) => {eventhandlemethod(sometext);});
eventhandlemethod(string s)
{
   MessageBox.Show(s);
}

提前致谢!

标签: c#

解决方案


我不熟悉 VB.NET,但匿名函数或动作,就像在事件处理程序的情况下一样,基本上只是一种简短的写作形式。

但线是什么

Class.Event += Class.Delegate((sometext) => {eventhandlemethod(sometext);});

告诉你?

  1. 您有一个事件,并且添加了处理程序(显然)。
  2. 您添加了一个匿名方法作为 Eventhandler 并从中创建了一个委托。

    Class.Delegate(<anoymous method, matching the siganture of the handler>);
    
  3. 您的匿名方法如下所示

    (sometext) => {eventhandlemethod(sometext);} 
    

这个匿名方法(简称lamba)由两部分组成

siganture => body

在您的情况下,签名得到eh“sometext”。源自您的其余代码,这似乎是一个字符串。而且由于事件处理程序始终将 void 作为返回值,因此您的方法(您是否编写了普通方法)将如下所示:

private void (string sometext)
{
}

这基本上就是您的事件句柄方法的样子。你也可以这样写这个 lambda。

(string sometext) => {eventhandlemethod(sometext);}

这向您显示了预期的输入类型。但是你通常可以省略这个。

所以同样好:你可以写

  1. 使用“正常”方法,因为您已经拥有它

    Class.Event += Class.Delegate(eventhandlemethod);
    
  2. 有一个 lambda

    Class.Event += Class.Delegate(sometext => MessageBox.Show(sometext));
    

如果您有多个输入变量,请将它们放在括号中

(string s, int i, bool b) => Console.WriteLine($"{s}:{i}:{b}");

当然,您也可以省略类型以及离开您:

(s, i, b) => Console.WriteLine($"{s}:{i}:{b}");

我希望我能为你澄清一下。


推荐阅读