gpt4 book ai didi

c# - 检查现有的 'wired up' 方法

转载 作者:行者123 更新时间:2023-11-30 13:23:41 24 4
gpt4 key购买 nike

我可能误解了这里的一些基本概念,因为我是这些概念的新手,所以请多多包涵。

我目前正在从这样的事件中删除方法:

scheduleView.TouchDown -= scheduleView_TouchDown;

然后在其他场合 - 添加方法:

scheduleView.TouchDown += scheduleView_TouchDown;

到目前为止一切正常,我可以理解可以添加多种方法,如下所示:

scheduleView.TouchDown += scheduleView_TouchDown;
scheduleView.TouchDown += scheduleView_AnotherTouchDownEventHandler;

但是我之后如何检查连接到此事件的方法是什么?

最佳答案

有趣的是,您不能(至少,从外面看)。 事件有义务提供 2 个访问器 - addremove。 CLI 规范中定义了其他访问器方法,但它们未在 C# 或其他任何地方 AFAIK 中使用。关键点:我们不能询问 event 订阅了什么(事实上,我们不需要知道)。您所能做的就是:添加删除

如果您担心重复订阅,请注意,如果您尝试取消订阅但实际上并未订阅,那么在每个理智的实现下,这只是一个空操作;这意味着您可以:

// make sure we are subscribed once but **only** once
scheduleView.TouchDown -= scheduleView_TouchDown;
scheduleView.TouchDown += scheduleView_TouchDown;

从引发事件的代码的角度来看,您很少需要知道 - 只需:

// note I'm assuming a "field-like event" implementation here; otherwise,
// change this to refer to the backing-field, or the delegate from the
// event-handler-list
var handler = TouchDown;
if(handler != null) handler(this, EventArgs.Empty); // or similar

还有一种方法可以将委托(delegate)列表分解为单个订阅者,但很少需要:

var handler = TouchDown;
if(handler != null) {
foreach(EventHandler subscriber in handler.GetInvocationList()) {
subscriber(this, EventArgs.Empty);
}
}

主要用途是:

  • 当您想对每个订阅者执行异常处理时
  • 当委托(delegate)返回值或更改状态时,您需要针对每个订阅者进行处理

关于c# - 检查现有的 'wired up' 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9499933/

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