![]() |
1
59
它仍然适用于具有显式添加/删除的事件-您只需要使用委托变量(或以存储委托的方式)而不是事件名称。 但是,有一种更简单的方法使其线程安全—使用无操作处理程序初始化它:
调用一个额外的委托对性能的影响可以忽略不计,而且它确实使代码更容易编写。 顺便说一句,在扩展方法中,您不需要额外的局部变量-您可以执行以下操作:
就我个人而言,我不会使用关键字作为参数名,但它实际上根本不会改变调用方,所以请执行您想要的操作:) 编辑:至于“OnXXX”方法:您是否计划从中派生类?在我看来,大多数类都应该被密封。如果你 做 |
![]() |
2
14
现在C#6出现了,有一种更紧凑、线程安全的方式来触发事件:
问题中的“处理程序”代码要解决的线程问题在这里被回避了,因为就像在代码中一样,
这个答案也许与最初的问题相去甚远,但对于那些寻找更简单的方法来引发事件的人来说却非常相关。 |
![]() |
3
5
[这里有一个想法] 只需按照推荐的方式编写代码一次,然后就可以完成了。这样你就不会让你的同事在查看代码时觉得你做错了什么?
|
![]() |
4
3
代码越少,可读性越强。我喜欢。 如果您对性能不感兴趣,可以这样声明事件以避免空检查:
|
![]() |
5
1
你不是 “确保” 通过将处理程序分配给局部变量实现线程安全。作业完成后,您的方法仍可能被中断。例如,如果用于侦听事件的类在中断期间被释放,则您正在调用已释放类中的方法。 你正在从一个空引用异常中拯救自己,但是有更简单的方法可以做到这一点,正如Jon Skeet和cristianlibardo在他们的回答中指出的那样。 另一件事是,对于非密封类,OnFoo方法应该是虚拟的,我认为这在扩展方法中是不可能的。 |
![]() |
6
0
为了进一步了解上述答案,您可以保护自己不受某个处理程序抛出异常的影响。如果发生这种情况,则不会调用后续处理程序。
|
![]() |
OREO · 如何在不实际单击复选框的情况下选中它 10 月前 |
![]() |
Dan · 在元素外部设置html点击处理程序点击后立即触发 1 年前 |
![]() |
Mero · Svelte在父事件调用上调用新的嵌套事件处理程序 1 年前 |
|
iorice · usercontrol dll中的组件事件 1 年前 |
![]() |
Awin · 点击事件功能不适用于Vue组件 1 年前 |
![]() |
Kiwi · 将可共享的自定义数据添加到事件MS图形api 1 年前 |