Почему события не имеют никаких типов возврата в.NET?

nl2br() функция используется для создания новой строки

echo nl2br("Welcome\r\n This is my HTML document", false);

Приведенный выше пример выдаст:

Welcome
Это мой HTML-документ

7
задан Josh 29 May 2009 в 06:49
поделиться

6 ответов

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

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

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

22
ответ дан 6 December 2019 в 05:56
поделиться

На самом деле, события могут иметь возвращаемые значения; просто, это не очень хорошая идея, так как требует более сложной обработки, когда может быть несколько слушателей ... чаще может быть устанавливаемое свойство подкласса 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();
    }
}
8
ответ дан 6 December 2019 в 05:56
поделиться

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

0
ответ дан 6 December 2019 в 05:56
поделиться

Им не нужно. Подумай об этом. Что бы они вернули?

3
ответ дан 6 December 2019 в 05:56
поделиться

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

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

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

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

0
ответ дан 6 December 2019 в 05:56
поделиться

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

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

-2
ответ дан 6 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: