代码之家  ›  专栏  ›  技术社区  ›  Mark T

事件删除语法

  •  8
  • Mark T  · 技术社区  · 16 年前

    我对在C中删除事件处理程序的语法感到困惑。

    Something += new MyHandler(HandleSomething); // add
    Something -= new MyHandler(HandleSomething); // remove
    

    “new”在每行上创建一个新对象,因此添加一个对象 然后要求它删除另一个对象。

    到底是怎么回事?
    从语法上看,它确实不明显。

    3 回复  |  直到 16 年前
        1
  •  19
  •   Charles Bretana    16 年前

    +=和-=是名为add()和remove()的内置内部方法的语法快捷方式,它们添加或删除指向委托作为私有字段具有的内部委托链接列表的指针。运行remove时,它从链接列表的开头开始,一次检查列表中的每个委托,直到找到一个与传递给remove()方法的委托“相等”为止。(使用-=语法)

    然后,它从链接列表中删除该列表,并修补链接列表以保持其连接…

    在此上下文中,“equals”方法(对于delegate())将被重写,以便它只比较委托的目标和methodptr,这两个方法将相同,即使您已经创建了一个要传递以删除的新委托…

        2
  •  7
  •   womp    16 年前

    “new myhandler”实际上是多余的。你可以简单地做

    Something += HandleSomething; // add
    Something -= HandleSomething; // remove
    

    C中的所有事件都是多播委托,因此,+=和-=语法表示要向将要调用的委托列表添加/删除委托。

    至于幕后发生的事情,我发现最好的解释是 Jon Skeet's .

        3
  •  -1
  •   Josh E    16 年前

    可以将事件视为引发事件时执行的委托逻辑的占位符方法。单个事件可以有多个订阅服务器(多个强制转换),因此,+=和-=语法是单个事件处理程序的附加或删除方式。简单地执行分配将重置事件的订阅,这可能会导致不必要的副作用。

    编辑: this link 解释有关C中事件的更多信息#

    推荐文章