2010-07-23 50 views
2

我真的在理解事件和委託的概念。我知道委託是持有對方法的引用的對象,並且可以調用具有相同返回類型和參數的方法,但是到底是什麼事件?事件和代表的困境

如果我需要使用事件來製作一個簡單的計算器,那我該如何使用它們以便有3個事件:一個可以用於數字,一個用於操作員,另一個用於平等或結果操作。

+0

的可能重複[幫助理解.NET委託,事件和事件處理(http://stackoverflow.com/questions/2814065/help-understanding-net-delegates-events-and-eventhandlers)的 – 2010-07-24 08:34:45

+0

可能重複[什麼是委託和事件之間的區別是什麼?(http://stackoverflow.com/questions/29155/what-are-the-differences-between-delegates-and-events) – nawfal 2014-07-06 20:44:57

回答

0

我知道DAT代表們對象

這不是真的如此。 代表 - 是類型。事件 - 是代表的實例(用特殊關鍵字標記以通過編譯器生成一些額外的工作人員)。

+2

*這是*不是真的真正。活動*不是代表的實例。他們真的是一對添加/訂閱方法。而「委託」是一個不明確的詞 - 你可以聲明一個委託*類型*,你可以創建一個委託*實例*。 – 2010-07-23 20:14:41

+0

*他們對添加的/訂閱方法真的。* 但他們並不只是* *一對的方法。事件聲明的類型*必須是*委託類型,不是嗎? – 2010-07-23 20:24:45

+0

我相信代表可以訂閱事件作爲處理程序,但事件不是代表。 – recursive 2010-07-23 22:01:33

0

你可以看到事件代表實體的集合。一個事件的訂閱者/監聽者通過提供一個委託instans來自我註冊。

有一次,該事件的「所有者」可以提出該事件。這將調用「集合」中的所有代表實例。

0

委託人確實是指向自己簽名方法的指針。您可以將事件看作指向代表列表的指針。 在調用的方式,他們都大同小異。

如果您看到Observer設計模式,則有一個事件有多個訂閱者,這種區別可以理解。發佈者類將檢測到一些「事件」並將其提升,並且所有訂閱者都會被調用。

像你創建一個按鈕類和容器要訂閱點擊事件,將其處理程序附加到您的按鈕類引發的單擊事件..

在計算器的形式,輸入可以是按鈕,在你後面的代碼中可以製作單個方法,並通過事件參數,確定單擊哪個按鈕並應用邏輯。

0

delegate一個基本上是一個或多個引用的集合,以具有相同的方法簽名的方法。在c#中,使用+(或+=)向委託添加新方法,使用-(或-=)從委託中刪除方法。

event是可以在代碼中提出,然後調用連接到它的代表的所有方法。事件幾乎總是有代表返回void,帶有兩個參數:Object sender和事件參數,它們始終是從System.EventArgs派生的類。

例如,如果我想寫一個事件OnCookFood在我的廚師班。注意:這個假設我首先寫了一個CookEventArgs課程,因爲我大概想要通過廚師烹飪的食物。

// modifier delegate void HandlerName(Object sender, EventArgsClass e) 
// modifier event HandlerName EventName 
public delegate void CookFoodHandler(Object sender, CookEventArgs e); 
public event CookFoodHandler OnCookFood; 

// More code... 
OnCookFood(new CookEventArgs("Pie")); 

當然,這是很難做到的。您可以使用EventHandler<T>類可以讓編譯器爲您創建委託:

public event EventHandler<CookEventArgs> OnCookFood; 

// More code... 
OnCookFood(new CookEventArgs("Pie")); 

最後,添加一個處理;假設我們有一個對象cook

void HandleCooking(Object e, CookEventArgs e) { 
    // Do something here 
} 

// in another function, probably the constructor... 
cook.OnCookFood += HandleCooking; 
+0

委託是一個指向其簽名被固定的方法的指針//除了隱含的'this'參數外//還有一個適當類型的對象以傳遞給'this'參數。代表的一個主要特點是代表的調用者不必知道任何有關其'this'參數的類型;它保證匹配任何方法的期望。 – supercat 2010-12-07 23:10:40

13

代表基本上是一個方法指針。委託讓我們創建一個引用變量,但不是引用一個類的實例,而是引用類中的一個方法。它引用具有返回類型並具有與該委託指定的相同參數的任何方法。這是Event的一個非常有用的方面。

事件根本的東西,在我們的程序發生了。一旦發生,訂閱該事件的對象就會響應該事件。在現實世界的例子中,它很容易理解。 我會舉一個板球的例子。讓我們以擊球爲事件。所以,一旦球被擊球手擊中,Fielder就會跑向它,裁判跟蹤球,並且擊球手會留意球的位置。觀衆已經準備好跳起大喊。因此,這裏擊球是一件大事。擊球手,裁判員,守場員和觀衆是對這一事件做出迴應的對象。事件完全不知道誰會對此做出迴應,並以什麼方式迴應。響應的對象需要先訂閱該事件,然後在事件被觸發時通知他們,並且可以以他們想要的方式處理該事件,如我們的守場員,裁判員,觀衆,擊球手以他們自己的方式進行。在dotnet中,他們通過使用事件處理程序來處理事件。這只是關於真實世界場景的簡短描述。 爲了進一步閱讀和理解,請閱讀中的主題。首先由O'Reilly編寫的C#。它真正地解釋了與現實世界的例子有關的這些話題。一旦你通過它,你將能夠抓住它並牢記在心。 希望它能幫助:)

0

下面是關於這一主題的夢幻般的文章喬恩斯基特,我建議購買他的書的副本也。

Delegates and Events.