回答
因为事件可以由多个监听器处理。对于事件处理程序并不保证顺序(尽管我认为它们按照它们在现实中订购的顺序被调用)。
相反,对于想要“返回”某些数据的事件,约定是有一个可变的EventArgs对象,例如可以将其Cancel属性设置为true的CancelEventArgs。这比返回值的优点是链中的事件处理程序可以查看属性以查看另一个处理程序是否已经设置了它。但是你仍然认为最后一个设置财产的情况会胜出。
如果它是一个返回值,那么整个概念将会变得复杂得多。
是的,多个事件处理程序肯定会证明在确定所有这些异步返回来自何处的麻烦。 – ChrisBD 2009-05-29 06:55:56
+1;好答案。 – 2009-05-29 06:58:35
@ChrisBD - 从个别处理程序获取反馈的过程是明确的;当你使用可变的“args”类型时,它并没有什么不同。 – 2009-05-29 07:16:50
他们不需要。想想看。他们会返回什么?
+1正是我要写的。他们会回来什么,他们还会回来,它会怎么做? – 2009-05-29 06:51:20
......而不是最不重要;谁会退还? – 2009-05-29 06:52:06
这是因为一个事件是一个异步调用。您可以同时处理同一事件的多个副本。
因此,它们只传递信息,以便处理返回类型,事件提升者必须同步并等待事件处理程序完成。这将使其像任何其他程序调用一样。
发射事件是单向信号。它们主要用于实现松耦合,因为事件的提升者不依赖于消费者。返回值会创建对消费者的依赖关系。
事实上,事件可以有返回值;简单地说,这不是一个好主意,因为当可能有多个监听器时它需要更复杂的处理......更常见的是,可能有一个可设置的属性,即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();
}
}
它在设计事件系统...事件系统的主要目的是通知不确认。
事件是一种通知其听众(观察者)已发生重大操作的方式。它不是以这种方式设计的,不仅要通知听众已经发生了重大行动,而且还要向事件源确认它是什么?正在处理?否则......你如何决定怎么做?
如果一个事件需要返回一个值,如果没有处理程序与它关联,它将返回一个值。如果一个事件有多个处理程序会怎么样...然后如何决定应该返回哪个处理程序的值。
首先这个事件可以返回值。虽然这不是最佳做法。
- 1. 为什么BeginInvoke类型的AsyncResult没有返回引用?
- 2. 为什么输出没有返回类型
- 3. 转换C#到VB,NET:事件与具有返回类型
- 4. 为什么事件处理程序总是有返回类型的void?
- 5. 为什么Scala保持不返回Iterable的类型(如.Net)?
- 6. Excel Worksheet.Usedrange返回什么类型返回
- 7. 为什么aspect要返回int类型?
- 8. sizeof为什么返回类型
- 9. 为什么类型(mock.MagicMock())== mock.MagicMock返回False?
- 10. 返回什么类型?
- 11. fwrite()返回什么类型?
- 12. 为什么Facebook返回null end_time事件?
- 13. TinyOS中事件的返回类型
- 14. 为什么在实现接口时没有隐式转换返回类型?
- 15. 为什么readf没有返回值?
- 16. 为什么递归没有返回值
- 17. 为什么fetch_assoc()没有返回值?
- 18. 在C#中返回属性类型.net
- 19. 返回类型为void的方法返回的是什么?
- 20. 为什么在跟踪返回类型中使用了decltype?
- 21. 在Rust中使用`!`作为返回类型是什么?
- 22. 为什么Type.GetType在sitefinity中使用telerik类型返回null?
- 23. 为什么我的MultiSelectList没有将数据返回到模型?
- 24. 为什么返回类型Observable比原始类型好?
- 25. 为什么异步调用的返回类型是.NET中的IAsyncResult?
- 26. 为什么typedef没有强类型?
- 27. 为什么字面值没有类型?
- 28. 为什么返回在onclick事件处理程序中使用?
- 29. 为什么在android中的事件意图不返回结果?
- 30. 为什么部分方法只能有void返回类型?
事件处理程序*可以*返回值,请参阅http://stackoverflow.com/a/3325424/119271 – Douglas 2013-01-15 12:23:23