c# - 哪个 C# 模式具有更好的性能来避免重复的事件处理程序?

标签 c# eventhandler

基本上有两种模式可以避免重复注册事件处理程序: (根据这个讨论:C# pattern to prevent an event handler hooked twice)

  1. 使用 System.Linq 命名空间,并通过调用 GetInvocationList().Contains(MyEventHandlerMethod); 检查事件处理程序是否已注册

  2. 注册前先注销,如下:

    MyEvent -= MyEventHandlerMethod;
    MyEvent += MyEventHandlerMethod;
    

我的问题是,就性能而言,哪个更好,或者它们之间在性能上有显着差异吗?

最佳答案

我认为这无关紧要,无论是在假定的性能提升还是实际差异方面。

GetInvocationList-= 都遍历内部数组_invocationList。 (参见 source)

LINQ 扩展方法 Contains 将花费更多时间,因为它需要遍历和转换整个数组,返回并由 Contains 本身进行检查。 Contains 的优点是它不需要添加事件处理程序如果它存在,这将意味着一些性能提升。

关于c# - 哪个 C# 模式具有更好的性能来避免重复的事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27703913/

相关文章:

c# - Assembly.GetTypes() 返回奇怪的类型名称,例如 "<>c"

javascript - 如何使用 jquery 启用禁用的事件处理程序

java - 在 JavaFX 中设置按钮操作时出现 "Cannot find symbol constructor, EventHandler does not take parameters"

c# - 为什么我的事件处理程序是目标 <>c?另外 - <>c 是什么?

c# - 5 秒后未完成时取消长时间运行的任务

c# - 如何在 ASP.NET Core 2.0 中配置登录尝试并由管理员手动解锁?

C# 通过强制转换运算符进行动态转换

JavaFX,使用箭头键移动 GridPane 中的节点

JavaScript : onclick ="class method" => possible?

c# - Windows Phone 8.1 和 CurrentAppSimulator