Почему у событий нет типов возврата в.NET?
События также "делают" что-то вроде методов, но у них нет типов возврата и просто пустоты?
Мне интересно узнать, почему это так? и почему они не возвращают типы?
6 ответов
Потому что события могут быть обработаны несколькими слушателями. Не существует гарантированного порядка для обработчиков событий (хотя я думаю, что они вызываются в том порядке, в котором они подписаны в реальности).
Вместо этого, для событий, которые хотят "вернуть" некоторые данные, соглашение должно иметь изменяемый объект EventArgs, такой как CancelEventArgs, у которого свойство Cancel может иметь значение true. Преимущество этого перед возвращаемым значением состоит в том, что обработчики событий в цепочке могут смотреть на свойство, чтобы видеть, уже установил ли его другой обработчик. Но вы по-прежнему сталкиваетесь с ситуацией, когда побеждает последний, кто установит свойство.
Если бы это было возвращаемое значение, вся концепция была бы намного более сложной.
На самом деле, события могут иметь возвращаемые значения; просто, это не очень хорошая идея, так как требует более сложной обработки, когда может быть несколько слушателей... чаще всего это может быть устанавливаемое свойство и EventArgs
подкласс.
Но вот пример использования возвращаемых значений с событиями; обычно это не очень хорошая идея; только для информации:
using System;
delegate int SomeBizarreEvent(object sender); // non-standard signature
class Foo {
public event SomeBizarreEvent Bizarro;
public void TestOverall() {
SomeBizarreEvent handler = Bizarro;
if (handler != null) {
Console.WriteLine(handler(this));
}
}
public void TestIndividual() {
SomeBizarreEvent handler = Bizarro;
if (handler != null) {
foreach (SomeBizarreEvent child in handler.GetInvocationList()) {
Console.WriteLine(child(this));
}
}
}
}
class Program {
static void Main() {
Foo foo = new Foo();
foo.Bizarro += delegate { return 1; };
foo.Bizarro += delegate { return 5; };
// writes 5 (the last result wins)
foo.TestOverall();
// writes 1, 5
foo.TestIndividual();
}
}
Это в дизайне системы событий... Основной целью системы событий является уведомление, а не подтверждение.
Событие - это способ уведомить слушателей (наблюдателей) о том, что произошло значительное событие. Он не предназначен для того, чтобы не только уведомлять слушателей о том, что произошло значительное действие, но и признавать источник события, что это то, что???? обрабатывается??? или еще... как ты решаешь что делать???
Если событие должно возвращать значение, где оно вернуло бы его, если с ним не связан ни один обработчик. Что если у события есть несколько обработчиков... Тогда как решить, какое значение обработчиков следует вернуть.
Прежде всего, эти события могут возвращать значения. Хотя это не лучшая практика.
Запуск события является односторонним сигналом. Они в основном используются для достижения слабой связи, поскольку инициатор события не зависит от потребителя. Возвращаемое значение создаст зависимость от потребителя.
Это связано с тем, что событие является асинхронным вызовом. Вы можете одновременно обрабатывать несколько копий одного и того же события.
Следовательно, они только передают информацию, поскольку для обработки возвращаемого типа обработчик событий должен будет синхронизироваться и ждать завершения обработчика события. Это сделало бы это так же, как любой другой вызов процедуры.