2009-05-29 53 views
7

事件也'做'像方法,但他们没有返回类型,只是空洞?为什么事件在.NET中没有返回类型?

我很好奇,为什么这样?为什么他们不返回类型?

+1

事件处理程序*可以*返回值,请参阅http://stackoverflow.com/a/3325424/119271 – Douglas 2013-01-15 12:23:23

回答

22

因为事件可以由多个监听器处理。对于事件处理程序并不保证顺序(尽管我认为它们按照它们在现实中订购的顺序被调用)。

相反,对于想要“返回”某些数据的事件,约定是有一个可变的EventArgs对象,例如可以将其Cancel属性设置为true的CancelEventArgs。这比返回值的优点是链中的事件处理程序可以查看属性以查看另一个处理程序是否已经设置了它。但是你仍然认为最后一个设置财产的情况会​​胜出。

如果它是一个返回值,那么整个概念将会变得复杂得多。

+0

是的,多个事件处理程序肯定会证明在确定所有这些异步返回来自何处的麻烦。 – ChrisBD 2009-05-29 06:55:56

+0

+1;好答案。 – 2009-05-29 06:58:35

+0

@ChrisBD - 从个别处理程序获取反馈的过程是明确的;当你使用可变的“args”类型时,它并没有什么不同。 – 2009-05-29 07:16:50

3

他们不需要。想想看。他们会返回什么?

+0

+1正是我要写的。他们会回来什么,他们还会回来,它会怎么做? – 2009-05-29 06:51:20

+0

......而不是最不重要;谁会退还? – 2009-05-29 06:52:06

-2

这是因为一个事件是一个异步调用。您可以同时处理同一事件的多个副本。

因此,它们只传递信息,以便处理返回类型,事件提升者必须同步并等待事件处理程序完成。这将使其像任何其他程序调用一样。

0

发射事件是单向信号。它们主要用于实现松耦合,因为事件的提升者不依赖于消费者。返回值会创建对消费者的依赖关系。

8

事实上,事件可以有返回值;简单地说,这不是一个好主意,因为当可能有多个监听器时它需要更复杂的处理......更常见的是,可能有一个可设置的属性,即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(); 
    } 
} 
0

它在设计事件系统...事件系统的主要目的是通知不确认。

事件是一种通知其听众(观察者)已发生重大操作的方式。它不是以这种方式设计的,不仅要通知听众已经发生了重大行动,而且还要向事件源确认它是什么?正在处理?否则......你如何决定怎么做?

如果一个事件需要返回一个值,如果没有处理程序与它关联,它将返回一个值。如果一个事件有多个处理程序会怎么样...然后如何决定应该返回哪个处理程序的值。

首先这个事件可以返回值。虽然这不是最佳做法。

相关问题