所以我坚持修复/维护另一个程序员的代码(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/