c# - 不知道这个 c# 事件处理与 lambdas 是如何工作的,有人可以向我解释一下吗?
问题描述
我正在寻找一种将 vb 事件处理转换为 c# 的方法,因为我正在实现某些东西,并且在阅读了这篇文章(如何从 C# 中的匿名事件处理程序转换为 VB.Net)之后,我尝试复制 lambda 结构,并且不知何故,它起作用了,但我不知道。它是怎么做的,有人可以给我解释一下吗?或者至少引导我到一个教程的链接或帮助我理解这里发生了什么的东西......我的意思是,我可以摆脱这个,因为它,不知何故,工作,但我想了解发生了什么不仅仅是“完成工作”。
Class.Event += Class.Delegate((sometext)) => {eventhandlemethod(sometext);});
eventhandlemethod(string s)
{
MessageBox.Show(s);
}
提前致谢!
解决方案
我不熟悉 VB.NET,但匿名函数或动作,就像在事件处理程序的情况下一样,基本上只是一种简短的写作形式。
但线是什么
Class.Event += Class.Delegate((sometext) => {eventhandlemethod(sometext);});
告诉你?
- 您有一个事件,并且添加了处理程序(显然)。
您添加了一个匿名方法作为 Eventhandler 并从中创建了一个委托。
Class.Delegate(<anoymous method, matching the siganture of the handler>);
您的匿名方法如下所示
(sometext) => {eventhandlemethod(sometext);}
这个匿名方法(简称lamba)由两部分组成
siganture => body
在您的情况下,签名得到eh“sometext”。源自您的其余代码,这似乎是一个字符串。而且由于事件处理程序始终将 void 作为返回值,因此您的方法(您是否编写了普通方法)将如下所示:
private void (string sometext)
{
}
这基本上就是您的事件句柄方法的样子。你也可以这样写这个 lambda。
(string sometext) => {eventhandlemethod(sometext);}
这向您显示了预期的输入类型。但是你通常可以省略这个。
所以同样好:你可以写
使用“正常”方法,因为您已经拥有它
Class.Event += Class.Delegate(eventhandlemethod);
有一个 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}");
我希望我能为你澄清一下。
推荐阅读
- vue.js - Vuejs中未刷新字段
- python - Django文件上传为不同的用户
- php - Laravel Eloquent sum on realtions
- datastax - 为 Apache TinkerPop 的 Spark-Gremlin 指定工作池 - DataStax-Enterprise Graph-Analytics
- json - 如何将此复杂 Json 转换为 Dart 对象
- java - 发送列表
从一项服务到另一项服务给出“当前请求不是多部分请求”异常 - javascript - 对于后续迭代中的循环跳过变量声明
- loopback4 - loopback 4.0 是否曾经并行运行查询?
- javascript - javascript。innerHTML 清除内容已推送到数组
- android - 预期的 URL 方案“http”或“https”但未找到冒号