c# - 在 .Net 中设置/删除事件处理程序

标签 c# .net event-handling lambda

所以我坚持修复/维护另一个程序员的代码(blech)

我是规则的坚定教授“如果它没有坏就不要修复它!”所以尽管每次遇到可怕的代码时都想改变一些东西,但我将自己限制在仅更改可能的绝对最小代码量以进行所需的修复。但在某些情况下,在尝试遵循/更改它之前,我真的需要了解一些东西。

我在这里遇到了这一点:

region.LineSelected = (x) => { };

我想知道它是否与此相同:

region.LineSelected = null;

在我改变它所在的方法之前,我想对第一行所做的事情有 100% 的肯定。

最佳答案

根据我目前对该主题的看法进行编辑

它们不一样。 lambda 版本正在向一个空的匿名方法添加一个事件处理程序。这允许其他代码自由引发 LineSelected() 而不必担心它是否为 null(即没有监听器)。

例如。

var lineSelected = this.LineSelected;

if (lineSelected != null)
{
    lineSelected(EventArgs.Empty);
}

如果在 if 之后但在引发事件之前在另一个线程中取消订阅 LineSelected,则上述语句可能会抛出 NullReferenceException。 将 LineSelected 分配给临时变量,然后引发可以调用未订阅的事件监听器。将事件处理程序分配给局部变量是处理空委托(delegate)的推荐方法。

通过添加一个空委托(delegate),其他代码总是能够调用 LineSelected 而不必担心 NullReferenceException。 通过将多播事件委托(delegate)分配给局部变量,您可以确保该值不能被被另一个线程修改。

关于c# - 在 .Net 中设置/删除事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/611492/

相关文章:

c# - 尝试在音频播放代理中播放音频时出错。 System.SystemException:HRESULT = 0xC00D001A

c# - 更好的 Enumerable.Range 升序和降序范围?

.net - 如何编码以在对话中对电子邮件进行分组

c# - Log4Net smtp appender 仅在出现完整日志(调试和信息和错误)错误时发送电子邮件。仅当应用程序结束时

java - 您如何使用 JavaFX 监听在 TextField 中完成的鼠标粘贴?

c# - 同时使用 ObjectContext 和 DbContext

c# - 制作接收azure订阅数据的应用程序

c# - 将点击事件添加到通过文字呈现的动态按钮

c# - 生成具有指定位长度的盐

javascript - ReactJS - 如何检测何时在文件输入上单击取消?