[英]How is an event raised in C#?
我對控制台應用程序C#中的事件的理解:
創建一個與訂閱者類中的事件處理程序方法具有相同簽名的委托。
根據此委托聲明一個事件
引發事件
我對這一步驟的理解是:它只是一個包裝函數,將參數傳遞給事件以調用事件指向的事件處理函數。
因此引發事件只是調用publish類中的wrapper函數。
現在,當我創建一個非常簡單的Windows窗體應用程序時,我將無法應用此一般概念。
考慮僅一個按鈕的WinForms應用程序。
// registering statement
Button1.Click += new EventHandler (this.button1_click)
我可以確定第一步。 它是預定義的System.EventHandler委托。
按鈕的點擊事件也是預先定義的。 沒問題。
事件引發步驟:在這里,我無法在控制台應用程序和Windows應用程序之間建立連接。
在哪里保存了實際引發WinForms應用程序事件的代碼? 我們似乎不必編寫代碼。
我知道有人“單擊”按鈕時會引發單擊事件,但是在WinForms應用程序的C#代碼中如何實現呢?
編譯器如何“公正地”知道按鈕的Click事件意味着某人單擊按鈕,因此應該引發一個事件?
如何引發點擊事件? 參數如何傳遞給事件?
您的理解有些倒退。 我認為這就是您遇到問題的原因。
您沒有創建與訂閱者類中的事件處理程序方法具有相同簽名的委托。
您正在執行的操作是聲明要委派執行的功能的外觀。 這是EventHandler的簽名:
public delegate void EventHandler(object sender, EventArgs e)
因此,如果您希望某個函數能夠處理事件的委托,則它必須遵循該簽名。
現在,將執行委托給訂閱者的類需要引用這些函數,以便在事件發生時可以調用它們。 這就是為什么要實現事件屬性。 隨之而來的是,Button類必須公開此屬性,以便您能夠“掛鈎”您的代表:
public event EventHandler Click
(注意,這是從Control繼承的)
當您注冊“事件處理程序”時:
Button1.Click += new EventHandler (this.button1_click)
本質上,您是在說,每當Button1實例引發Click事件時,都將觸發this.button1_click(object sender, EventArgs e)
。
Button1實例將在內部決定何時觸發事件,屆時它將使用event屬性將執行委派給訂閱的函數。 它將使用上述參數調用它們,其中發送者很可能是實例本身,而EventArgs類將為您提供有關引發事件的條件的其他信息。 通常還可以實現該屬性以添加其他檢查(例如,首先是否有任何要調用的內容)。
如您所見,真正引起點擊的代碼是Button(或其繼承鏈)實現的內部。 顯然,它涉及鼠標跟蹤,而不涉及鼠標跟蹤,這就是使用控件的好處,除非您想從頭開始編寫所有檢測內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.