在C#中咱們常常會碰到事件,尤爲是在WPF或者WinForm中,窗體加載、或者點擊一個按鈕,都會觸發事件。實際上,事件是對委託的封裝。若是不進行封裝,讓委託暴露給調用者,調用者就能夠把委託變量從新引用到新的委託對象,也就刪除了當前要調用的方法列表;更糟糕的是,公共的委託成員打破了封裝不只致使代碼難以維護和調試,並且會致使應用程序有安全風險。下面分別說明。c#
一、委託安全
委託能夠理解爲一種協議。委託,是什麼意思呢?舉個例子,你碰到一件事,你須要讓別人來幫你作(可能你還有別的事情要作),這就是委託,把你如今不能作的事讓別人去作。爲何說委託就像一個協議呢,由於你不想把事情搞砸了,因此你「委託」的這我的作的這件事,你須要給他定一個標準。在C#中就是給所委託的對象定義好籤名,參數有幾個,分別是什麼類型,委託方法須要反饋給你什麼東西(或者不反饋)。從這種意義上理解,委託就像是一種協議。下面是例子。函數
上述例子中public delegate int MyDelegate(int x, int y);聲明瞭一個委託,告訴被委託者這件事你要這麼幹,我給你兩個整數,你計算他們的和,怎麼計算我無論,計算完以後你把和給我。spa
二、事件設計
在某件事情發生時,一個對象能夠經過事件通知另外一個對象。好比,前臺界面一個求和按鈕被點擊了,他通知你,能夠把a和b這兩個數相加了。這就是一個事件。能夠看出事件是在一個時間節點去觸發另一件事情,而另一件事情怎麼去作,他不會關心。就事件來講,關鍵點就是何時,讓誰去作。調試
在編譯器處理event關鍵字時,會自動提供註冊和註銷方法以及任何須要的委託類型成員變量(私有的),所以不能從觸發事件的對象去調用它們,event關鍵字就像一個語法糖,節省了咱們打字的時間。code
定義一個事件有兩步,首先定義一個委託,它包括了這件事的「協議」和委託方法(由誰去作);其次,用event關鍵字和相關委託聲明這個事件。事件像是一個接口,封裝了委託所定的「協議」。因爲委託已經定義了協議,剩下的就是按這個協議去辦事,至於怎麼作它並不關心。下面是一個例子。orm
從上面能夠看出,調用者沒法訪問委託對象。
對象
三、回調函數接口
回調函數就是把一個方法的傳給另一個方法去執行。回調函數只是一個功能片斷,由用戶按照回調函數的調用約定來實現的一個函數。先看一個例子。
能夠看出,能夠把任意一個符合這個委託的方法傳遞進去,意思就是說這部分代碼是可變的。而設計上有一個抽離出可變部分代碼的原則,這種用法無疑能夠用到那種場合了。
以上是我的理解,若是有不合理的地方歡迎交流。