Почему у событий нет типов возврата в.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();
    }
}

Им не нужно. Думаю об этом. Что они вернут?

Это в дизайне системы событий... Основной целью системы событий является уведомление, а не подтверждение.

Событие - это способ уведомить слушателей (наблюдателей) о том, что произошло значительное событие. Он не предназначен для того, чтобы не только уведомлять слушателей о том, что произошло значительное действие, но и признавать источник события, что это то, что???? обрабатывается??? или еще... как ты решаешь что делать???

Если событие должно возвращать значение, где оно вернуло бы его, если с ним не связан ни один обработчик. Что если у события есть несколько обработчиков... Тогда как решить, какое значение обработчиков следует вернуть.

Прежде всего, эти события могут возвращать значения. Хотя это не лучшая практика.

Запуск события является односторонним сигналом. Они в основном используются для достижения слабой связи, поскольку инициатор события не зависит от потребителя. Возвращаемое значение создаст зависимость от потребителя.

Это связано с тем, что событие является асинхронным вызовом. Вы можете одновременно обрабатывать несколько копий одного и того же события.

Следовательно, они только передают информацию, поскольку для обработки возвращаемого типа обработчик событий должен будет синхронизироваться и ждать завершения обработчика события. Это сделало бы это так же, как любой другой вызов процедуры.

Другие вопросы по тегам