В c # события могут быть двух типов
1. Multicast
2. UnitCast
Многоадресные события - это те, у кого более одного подписчика. когда происходит многоадресное событие, то будет вызван несколько обработчиков, потому что вы подписались более чем на один обработчик событий.
Итак, многоадресное событие предназначено для вызова нескольких обработчиков, а многоадресный обработчик не может иметь тип возвращаемого значения, почему ??
, поскольку если многоадресный делегат имеет тип возвращаемого значения, то каждый обработчик события будет возвращать некоторое значение, а возвращаемое значение одного обработчика события будет заменено значением следующего обработчика события.
Предположим, у вас есть многоадресный делегат, как показано ниже
public delegate int buttonClick;
public event buttonClick onClick;
onClick += method1
onclick += method2
onclick += metho3
когда это событие будет вызвано, тогда значение, возвращаемое method1, будет заменено значением, возвращаемым method2, и в итоге будет получено значение только method3.
Следовательно, в случае делегата многоадресной рассылки всегда рекомендуется не возвращать никакого значения.
но в случае одноадресного удаления, когда у вас будет только один подписчик. Таким образом, вы можете вернуть значение для выполнения вашей цели
Итак, для многоадресного делегата - тип возврата отсутствует
а для одноадресного делегата - может иметь тип возврата
Многоадресный делегат также может возвращать несколько значений, но для этого события его необходимо вызвать вручную.
Событие, если вы решили, что многоадресный делегат также должен возвращать значения, скажем, у меня есть событие, связанное с 4-х обработчиком событий, которое принимает два целых числа, и один обработчик добавляет, второе вычитание и третье умножение и последнее деление. Итак, если вы хотите получить тип возвращаемого значения всех обработчиков, то вам нужно вызвать событие вручную следующим образом:
var handler = _eventToRaised.GetInvocationList();
foreach(var handler in handlers)
{
if(handler != null)
{
var returnValue = handler()// pass the values which delegate expects.
}
}