我可能误解了一些基本的东西,因为我对这些概念不熟悉所以请耐心等待.
我正在从像这样的事件中删除方法:
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)
但是,我后来如何检查哪些方法连接到此事件?
有趣的是,你不能(至少从外面).一个event只有义务提供2个存取- add和remove.CLI规范中定义了其他访问器方法,但它们不在C#或其他任何AFAIK中使用.关键点:我们不能要求一个event什么是认购(而事实上,我们不应该需要知道的).你所能做的就是:add或remove.
如果你担心双重订阅,那么请注意,如果你试图取消订阅而你实际上没有订阅,那么在每个理智的实现中,这只是一个无操作; 这意味着你可以这样做:
// 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)
其主要用途是: