Почему у событий нет типов возврата в .NET? - PullRequest
7 голосов
/ 29 мая 2009

События также «делают» что-то вроде методов, но у них нет типов возврата и просто пустоты?

Мне любопытно узнать, почему это так? и почему они не возвращают типы?

Ответы [ 6 ]

22 голосов
/ 29 мая 2009

Поскольку события могут обрабатываться несколькими слушателями. Не существует гарантированного порядка для обработчиков событий (хотя я думаю, что они вызываются в том порядке, в котором они подписаны в реальности.)

Вместо этого, для событий, которые хотят «возвратить» некоторые данные, соглашение должно иметь изменяемый объект EventArgs, такой как CancelEventArgs, у которого для свойства Cancel можно установить значение true. Преимущество этого перед возвращаемым значением состоит в том, что обработчики событий в цепочке могут смотреть на свойство, чтобы видеть, уже установил ли его другой обработчик. Но вы все равно сталкиваетесь с ситуацией, когда побеждает последний, кто установил свойство.

Если бы это было возвращаемое значение, вся концепция была бы намного более сложной.

8 голосов
/ 29 мая 2009

На самом деле события могут иметь возвращаемые значения; просто это не очень хорошая идея, так как требует более сложной обработки, когда может быть несколько слушателей ... чаще всего это может быть устанавливаемое свойство подкласса 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();
    }
}
3 голосов
/ 29 мая 2009

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

0 голосов
/ 29 мая 2009

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

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

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

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

0 голосов
/ 29 мая 2009

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

0 голосов
/ 29 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...