回答
因爲事件可以由多個監聽器處理。對於事件處理程序並不保證順序(儘管我認爲它們按照它們在現實中訂購的順序被調用)。
相反,對於想要「返回」某些數據的事件,約定是有一個可變的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. .NET中事件的返回類型是什麼?
- 2. 爲什麼返回類型void在.NET中聲明爲struct?
- 3. 爲什麼BeginInvoke類型的AsyncResult沒有返回引用?
- 4. 爲什麼輸出沒有返回類型
- 5. 轉換C#到VB,NET:事件與具有返回類型
- 6. 爲什麼Scala保持不返回Iterable的類型(如.Net)?
- 7. 爲什麼事件處理程序總是有返回類型的void?
- 8. SQLite在Python中沒有返回類型
- 9. Excel Worksheet.Usedrange返回什麼類型返回
- 10. 爲什麼aspect要返回int類型?
- 11. 返回類型錯誤。爲什麼?
- 12. sizeof爲什麼返回類型
- 13. 爲什麼類型(mock.MagicMock())== mock.MagicMock返回False?
- 14. 返回什麼類型?
- 15. fwrite()返回什麼類型?
- 16. 爲什麼Facebook返回null end_time事件?
- 17. 爲什麼在實現接口時沒有隱式轉換返回類型?
- 18. TinyOS中事件的返回類型
- 19. 爲什麼qsort()沒有返回值?
- 20. 爲什麼這也會返回沒有
- 21. 爲什麼fetch_assoc()沒有返回值?
- 22. 爲什麼readf沒有返回值?
- 23. 爲什麼遞歸沒有返回值
- 24. 爲什麼沒有被返回?
- 25. 爲什麼任務沒有返回null
- 26. 返回類型爲void的方法返回的是什麼?
- 27. 爲什麼它不返回返回類型字符?
- 28. 爲什麼Type.GetType在sitefinity中使用telerik類型返回null?
- 29. 在Rust中使用`!`作爲返回類型是什麼?
- 30. 爲什麼在跟蹤返回類型中使用了decltype?
事件處理程序*可以*返回值,請參閱http://stackoverflow.com/a/3325424/119271 – Douglas 2013-01-15 12:23:23