Интересно, вы не можете (по крайней мере, снаружи). 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;
С точки зрения кода, поднимающего 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
Существует также способ разбить список делегатов на отдельных подписчиков, но это очень редко необходимо:
var handler = TouchDown;
if(handler != null) {
foreach(EventHandler subscriber in handler.GetInvocationList()) {
subscriber(this, EventArgs.Empty);
}
}
Основное использование для этого:
- когда вы хотите выполнить обработку исключений для каждого подписчика
- когда делегат возвращает значение или изменяет состояние, и вам нужно обрабатывать это для каждого подписчика