C# 事件委託

liuxixi發表於2017-06-05

看到百度上有關事件委託的通俗易懂的講解,覺得解釋的不錯,照搬過來以溫習之用。

問題:c# 事件的含義究竟是什麼(剛學習到委託的菜鳥提問)

在沒有學習委託之前,覺得事件就是單擊一個按鈕、雙擊一個按鈕等動作或者行為(事件是動作或行為)。
後來又覺得:單擊一個按鈕、雙擊一個按鈕僅僅是動作(或行為),這些動作行為本身不是事件,但是這些動作行為卻能觸發相應的事件。
現在:學習了委託與事件之後,又知道事件只是委託的一個例項,它是類的成員。

請問:這三種對事件的理解哪種對啊?

我查閱相關資料:上面說:
事件有兩種不同的含義:第一:表示發生了某個有趣的事情,第二:表示C#語言中已定義的一個物件。
還有人說:
從機制上講,事件就是你幹了什麼,你點選了一個button,選擇了一個下拉選單,點選關閉按鈕。那麼這個時候程式該怎麼反應呢?這就看你的事件(或者說動作)有誰關心和誰關聯。
在實現上,c#是用委託做的,事件是一個特殊的委託。
 

回答:

樓主的疑問和我當初很像,你努力的想弄明白什麼是委託,你也從側面瞭解到委託很重要,但是你並不知道委託具體是用來幹什麼的所以你才疑惑。
考慮一個問題,假設有兩個物件 A 和B,現在A想要知道B一個狀態(B_Staus)的變化,它馬上去執行一個動作(A_Action),用你現在的思路你該如何解決這個問題?
有三種思路,第一種,A設個定時器每隔一段時間就檢測B的狀態,但是這種方案缺陷太大,你要不停的檢測B的狀態,可能B一年才回變一次,那就太浪費了。而且即使這樣實時性也不好,不能保證馬上檢測到變化。

第二種 是將 A自己傳遞給B,讓B發生變化後呼叫A的函式,但是這樣B就要對A產生依賴,假如又來個C也要監聽,那你還要改動B的程式碼,很不便,而且B要知道所有A的資訊,這也是一種潛在的隱患。

第三種,就是隻將A需要執行的A_Action函式傳遞過去,B發生變化之後自動執行這個函式,那就需要有一種傳遞函式的方案,這就是委託。

委託去定義一個函式的簽名,所謂簽名就是這個這個函式接收什麼引數,返回什麼引數,分別都是什麼型別的。然後B 產生一個這個委託的例項,這就是事件。A或者C將自己的方法繫結到這個事件上來,即可。

  摘自:

  https://zhidao.baidu.com/question/1573655955150837900.html?qbl=relate_question_1&word=eventhandler

相關文章