gpt4 book ai didi

.net - 在 .NET 中使用事件处理程序

转载 作者:行者123 更新时间:2023-12-02 00:34:58 25 4
gpt4 key购买 nike

当不加区别地向一个对象的事件添加处理程序时,我意识到我可以将同一个处理程序附加到一个事件上任意多次。这意味着处理程序在每次附加时都会被调用一次。

我想知道这些事情:

  • 有没有办法查看哪些处理程序已添加到对象的事件中?
  • 是否可以从事件中删除所有处理程序?
  • 事件与其处理程序之间的相关性存储在哪里?

最佳答案

如果事件用 C# event 关键字标记,则无法从对象外部查看订阅者 - 所需信息不可见。

从内部来看,它是可以完成的,尽管它很复杂并且依赖于可能会改变的实现细节(尽管它们还没有)。

不过,一个可能对您有用的解决方法是,删除不存在的处理程序是有效的 - 不会引发异常。

所以这段代码是有效的:

myConnection.Closing -= ConnectionClosingHandler;
myConnection.Closing += ConnectionClosingHandler;

如果您已经订阅了该事件,第一行将删除订阅。
如果您没有订阅该事件,第一行什么都不做。

然后第二行连接了一个新的订阅,你保证不会被多次通知。

要回答您的最后一个要点,当您声明一个正常事件时:

public event PropertyChangedEventHandler Changed;

编译器创建一个类型为 PropertyChangedEventHandler 的成员变量,用于存储所有订阅者。如果需要,您可以接管存储空间:

public event PropertyChangedEventHandler Changed
{
add { ... }
remove { ... }
}

使用 -=+= 修改订阅不是语法糖 - 委托(delegate)是不可变的,当您添加或返回一个新实例删除处理程序。看看DelegateMulticastDelegate (两个 MSDN 链接)以获取有关其工作原理的更多信息。

关于.net - 在 .NET 中使用事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5033345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com