当前位置: 首页 > 编程笔记 >

C#Lambda表达式作为事件处理程序

崔绍辉
2023-03-14
本文向大家介绍C#Lambda表达式作为事件处理程序,包括了C#Lambda表达式作为事件处理程序的使用技巧和注意事项,需要的朋友参考一下

示例

Lambda表达式可用于处理事件,在以下情况下非常有用:

  • 处理程序很短。

  • 处理程序永远不需要取消订阅。

下面给出了一个可能使用lambda事件处理程序的良好情况:

smtpClient.SendCompleted += (sender, args) => Console.WriteLine("Email sent");

如果有必要在代码的某个将来点取消订阅已注册的事件处理程序,则应将事件处理程序表达式保存到一个变量中,并通过该变量进行注册/取消注册:

EventHandler handler = (sender, args) => Console.WriteLine("Email sent");

smtpClient.SendCompleted += handler;
smtpClient.SendCompleted -= handler;

这样做的原因不是简单地逐字重新键入lambda表达式以取消订阅(-=),原因是C#编译器不一定会认为两个表达式相等:

EventHandler handlerA = (sender, args) => Console.WriteLine("Email sent");
EventHandler handlerB = (sender, args) => Console.WriteLine("Email sent");
Console.WriteLine(handlerA.Equals(handlerB)); // May return "False"

请注意,如果向lambda表达式添加了其他语句,则可能会意外省略所需的大括号,而不会引起编译时错误。例如:

smtpClient.SendCompleted += (sender, args) => Console.WriteLine("Email sent");emailSendButton.Enabled= true;

这将进行编译,但会导致将lambda表达式添加(sender, args) => Console.WriteLine("Email sent");为事件处理程序,并emailSendButton.Enabled = true;立即执行该语句。要解决此问题,lambda的内容必须用大括号括起来。可以通过从一开始使用花括号来避免这种情况,在向lambda-event-handler添加其他语句时要格外小心,或者从一开始就用圆括号将lambda括起来:

smtpClient.SendCompleted += ((sender, args) => Console.WriteLine("Email sent"));
//添加额外的语句将导致编译时错误
           

 类似资料:
  • 我对lambda表达有意见。我的代码: 有可能吗?我只能使用java.util.function。我尝试从“lambda”中删除try catch,而我“main”方法应该正在捕获异常。

  • 我有一个lambda表达式,我希望能够传递和重用。代码如下: 这里的关键是,我希望能够将我在这里使用的lambda表达式传递到调用此代码的方法中,以便可以重用它。lambda表达式是我的。查询方法。我假设我想使用Action或Func,但我不太确定它的语法是什么,或者它是如何工作的。谁能给我举个例子吗?

  • 本文向大家介绍基于C++ Lambda表达式的程序优化,包括了基于C++ Lambda表达式的程序优化的使用技巧和注意事项,需要的朋友参考一下 什么是Lambda? C++ 11加入了一个非常重要的特性——Lambda表达式。营里(戴维营)的兄弟都对Objective-C很熟悉,许多人多block情有独钟,将各种回调函数、代理通通都用它来实现。甚至有人选择用FBKVOController、Bloc

  • 考虑if条件需要评估数组或列表的情况。一个简单的例子:检查是否所有元素都为真。但我正在寻找一种通用的方法来做这件事 通常我会这样做: 但现在我想把它隐藏到我的if条件中。我尝试使用Lambda表达式,但不起作用: 如果这有效,我可以做一些更复杂的事情,比如 有没有更好的方法来做这只是一个语法错误? 更新:我不是在谈论布尔数组,而是在寻找一种通用的方法来实现它。

  • 我正在使用Java8中引入的Stream API,为列表中的每个字符串运行一个方法。 如您所见,方法签名状态为抛出所有IOExceptions,流中的writeToString方法可能抛出IOException。但是,Java编译器给了我一个错误,指出流线上有一个未处理的IOException。 为什么流中的异常不会像方法中的其他异常一样被抛出?有没有什么方法可以在不在forEach lambda

  • 既然我有一个带有两个方法的,那么我如何用一个具体的类实现它呢?如何为这两种方法编写Lambda表达式?