2009-05-29 62 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

它在設計事件系統...事件系統的主要目的是通知不確認。

事件是一種通知其聽衆(觀察者)已發生重大操作的方式。它不是以這種方式設計的,不僅要通知聽衆已經發生了重大行動,而且還要向事件源確認它是什麼?正在處理?否則......你如何決定怎麼做?

如果一個事件需要返回一個值,如果沒有處理程序與它關聯,它將返回一個值。如果一個事件有多個處理程序會怎麼樣...然後如何決定應該返回哪個處理程序的值。

首先這個事件可以返回值。雖然這不是最佳做法。

相關問題