如何删除 lambda 事件处理程序 [重复]

2024-03-07

我最近发现我可以使用 lambda 来创建简单的事件处理程序。例如,我可以订阅这样的点击事件:

button.Click += (s, e) => MessageBox.Show("Woho");

但你如何取消订阅呢?


C# 规范明确指出 (IIRC),如果您有两个匿名函数(匿名方法或 lambda 表达式),它可能会也可能不会从该代码创建相等的委托。 (如果两个委托有相同的目标并引用相同的方法,那么他们是平等的。)

可以肯定的是,您需要记住您使用的委托实例:

EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;
...
button.Click -= handler;

(我找不到规范的相关部分,但如果看到 C# 编译器积极尝试创建相等的委托,我会感到非常惊讶。依赖它肯定是不明智的。)

如果您不想这样做,则需要提取一个方法:

public void ShowWoho(object sender, EventArgs e)
{
     MessageBox.Show("Woho");
}

...

button.Click += ShowWoho;
...
button.Click -= ShowWoho;

如果您想创建一个使用 lambda 表达式删除自身的事件处理程序,则有点棘手 - 您需要在 lambda 表达式本身中引用委托,并且您不能通过简单的“声明局部变量并分配使用 lambda 表达式”,因为这样变量就不会被明确赋值。通常,您可以通过首先为变量分配空值来解决此问题:

EventHandler handler = null;
handler = (sender, args) =>
{
    button.Click -= handler; // Unsubscribe
    // Add your one-time-only code here
}
button.Click += handler;

不幸的是,将其封装到方法中并不容易,因为事件没有清晰地表示。最接近的你可能会是这样的:

button.Click += Delegates.AutoUnsubscribe<EventHandler>((sender, args) =>
{
    // One-time code here
}, handler => button.Click -= handler);

即使这在内部实施起来也很棘手Delegates.AutoUnsubscribe因为你必须创建一个新的EventHandler(这只是一个泛型类型参数)。可行,但很混乱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何删除 lambda 事件处理程序 [重复] 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • Scala:当两个项目之一满足某些条件时进行模式匹配

    我经常编写比较两个对象的代码 并根据它们是否相同或不同 根据它们的不同之处 生成一个值 所以我可能会写 val result v1 v2 match case Some value1 Some value2 gt a case Some v
  • 工人、网络或服务;无论如何要访问窗口对象?

    我正在尝试在 webOS 中利用 Web Worker 来进行标牌应用程序 因为存在一个奇怪的错误 即使用 SCAP API 执行文件下载之间的时间呈指数级减慢 我的想法是尝试网络工作人员下载文件 希望这意味着问题会消失 应用程序会更快一些
  • 将 MySql 与 Entity Framework 4 和代码优先开发 CTP 结合使用

    我想我应该尝试一下 Scott Guthrie 的最新的帖子 http weblogs asp net scottgu archive 2010 07 16 code first development with entity framew
  • 在 Winforms 中将属性绑定到控件

    将属性绑定到控件的最佳方法是什么 以便当属性值更改时 控件的绑定属性也会随之更改 所以如果我有房产FirstName我想将其绑定到文本框txtFirstName文本值 所以如果我改变FirstName值 Stack 然后属性txtFirst
  • 将所有列表值增加一个增量[重复]

    这个问题在这里已经有答案了 我觉得我现在正经历一个白痴时刻 我有一个清单 我需要为每个数字加上 170 list1 1 2 3 4 5 6 7 8 list2 171 172 173 具体答复 使用列表理解 In 2 list1 1 2 3
  • 根据文字大小调整图像大小

    下面的 PHP 代码生成文本作为动态创建的图像 我如何才能使图像仅与文本一样大 谢谢
  • MDX 按维度属性计算的成员过滤器

    我想创建一个计算成员并按维度过滤它 这是工作示例 Policy Policy Status Void Policy Tran Type Renewal Measures FK Policy Distinct Count 但如果我想像这样过滤
  • 使用 jcc 在 pylucene/inheritance 中编写自定义分析器?

    我想用 pylucene 编写一个自定义分析器 通常在java lucene中 当你编写一个分析器类时 你的类继承了lucene的Analyzer类 但 pylucene 使用 jcc 即 java 到 c python 编译器 那么如何使
  • 使用 unittest.mock 在 Python 中模拟 os.remove

    我该如何嘲笑os remove with unittest mock 我的尝试 使用pytest def test patch remove with patch os remove remove foo 给出错误 remove foo E
  • Python:在循环内仅打印一次

    我有一个代码 我想从相机捕获视频 我想使用 Python 的日志库在 shell 上获取消息或将它们导出到文本文件 这是我的代码的一部分 在 while 循环内我想打印相机打开成功 import numpy as np import cv2
  • 在 php 中清理整个 $_POST 数组的好方法是什么? [复制]

    这个问题在这里已经有答案了 我有一个包含很多变量的表单 然后发送电子邮件 而不是清理每个变量 POST价值与filter var POST var FILTER SANITIZE STRING 我正在寻找一段更简单的代码 我想出了下面的内容
  • knit:在 Rmd 文档中编织单独的 Rnw 文档

    我有一个 R markdown 主文档 Rmd 我想在其中knit一些separate其中一个块中的 Rnw 文档 无子文档 然而 当我打电话时knit在Rnw文档上 包含的R代码块似乎没有被处理 导致尝试运行时出错texi2pdf在他们
  • 如何在 WPF 中播放 .flv 文件?

    如何在 WPF 中播放 flv 文件 请任何人帮助我 Create the interop host control var host new WindowsFormsHost Create the ActiveX control var
  • matlab中的散点极坐标图

    我正在尝试绘制楔形图 赤经与红移 我想我可以在极坐标中使用散点图 matlab中的极坐标函数似乎非常有限 甚至这个 polar a 1 a 2 Linewidth 1 给我一个错误 Error using polar line 23 Too
  • 在我的 math.h 中找不到 log2?

    我正在使用相当新安装的 Visual C 2008 Express 我正在尝试编译一个使用 log2 函数的程序 该程序是通过在 Mac 上使用 Eclipse 找到的 但是这台 Windows 计算机找不到该函数 错误 C3861 log
  • 通过 Segue 传递数据 (swift 2)

    这是一个小费计算器项目 它必须有一个设置视图 我可以在其中选择默认小费率 我在传递数据时遇到一些问题 当我选择默认小费百分比时 它在视图控制器中不会更改 而且我想让应用程序在关闭应用程序并重新打开时记住默认费率 如果有人纠正我的代码并对其进
  • 具有一个参数的多个构造函数

    因此 在学校我们接到了一项作业 用 OOP 制造一辆汽车 到目前为止 这一切都非常简单和直接 但现在我需要创建四个构造函数 一个不带参数 两个带一个参数 一个带两个参数 据我所知 重载的工作方式是检查您提供的参数数量 然后检查它必须使用哪个
  • ChartJS:图表不显示所有数据

    由于某种原因 该图表没有显示数组中的最后两个数据 var data labels Brasil Argentina Chile Paraguai Peru Bol via M xico datasets data 9 19 7 77 6 8
  • AWS API Gateway 始终返回 502 bad gateway

    我在 AWS 中创建了一个简单的 lambda 函数 它从 DynamoDB 返回列表 我还创建了 API Gateway 来触发 lambda 函数 当我在 AWS 控制台中测试时 该函数运行良好 但是当我在 Postman 中测试此功能
  • 如何删除 lambda 事件处理程序 [重复]

    这个问题在这里已经有答案了 我最近发现我可以使用 lambda 来创建简单的事件处理程序 例如 我可以订阅这样的点击事件 button Click s e gt MessageBox Show Woho 但你如何取消订阅呢 C 规范明确指出