检查现有的"有线"方法

3 c# methods events delegates

我可能误解了一些基本的东西,因为我对这些概念不熟悉所以请耐心等待.

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

scheduleView.TouchDown -= scheduleView_TouchDown;
Run Code Online (Sandbox Code Playgroud)

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

scheduleView.TouchDown += scheduleView_TouchDown;
Run Code Online (Sandbox Code Playgroud)

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

scheduleView.TouchDown += scheduleView_TouchDown;
scheduleView.TouchDown += scheduleView_AnotherTouchDownEventHandler;
Run Code Online (Sandbox Code Playgroud)

但是,我后来如何检查哪些方法连接到此事件?

Mar*_*ell 8

有趣的是,你不能(至少从外面).一个event有义务提供2个存取- addremove.CLI规范中定义了其他访问器方法,但它们不在C#或其他任何AFAIK中使用.关键点:我们不能要求一个event什么是认购(而事实上,我们不应该需要知道的).你所能做的就是:addremove.

如果你担心双重订阅,那么请注意,如果你试图取消订阅而你实际上没有订阅,那么在每个理智的实现中,这只是一个无操作; 这意味着你可以这样做:

// make sure we are subscribed once but **only** once
scheduleView.TouchDown -= scheduleView_TouchDown;
scheduleView.TouchDown += scheduleView_TouchDown;
Run Code Online (Sandbox Code Playgroud)

从代码提升的角度来看event,你很少需要知道 - 简单地说:

// 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
Run Code Online (Sandbox Code Playgroud)

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

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

其主要用途是:

  • 当您想要基于每个订户执行异常处理时
  • 当委托返回值或更改状态时,您需要在每个订阅者的基础上处理它