一:前言
本小節,我們需要停一停我們的小游戲開發,雖然它現在還不完美,還很簡單,甚至還有BUG。但是,為了更好的理解C#,現在到了該深入了解一些基礎知識的時候了。
當然,實際上,本小節內容對於零基礎入門的初學者來說,還是有點難了。委托與事件,如果只是泛泛的說一下,可能就是一兩句話。但是,我們的課程要遵循一個原則:知其然,知其所以然。所以,本小節的內容實際上有點多,但是我希望大家細細品味,爭取徹底消化委托和事件這兩個概念。
同時,本課程還要教會大家使用一個工具,分析代碼。
二:委托的現實場景:賣家委托快遞去送貨?
任何事情,首先都要問一個為什麼。這裡的問題是:為什麼賣家要委托快遞去送貨?
因為他干不了。他在北京賣一個壺到上海,他不應該、也沒能力自己跑到上海交給人家。所以他要“委托”給別人來做這件事情。
在代碼的世界中,也是這樣,我們的打老鼠游戲中,現在所有的邏輯代碼都在窗體的後台中,隨著我們學習面向對象,對代碼進行重構之後,業務邏輯代碼就會放到別的類中,這個“別的類”要負責“游戲開始”的邏輯,其中“游戲開始”的邏輯中有一個環節就是要在界面上顯示”游戲開始“。因為業務類不擁有窗體,所以它就不能顯示“游戲開始”,這個時候“委托”就派上用場了。也就是業務類不應該、也沒能力直接對窗體顯示“游戲開始”,於是,它“委托”窗體顯示“游戲開始”。
三:委托是什麼?
我們還是先回到賣家賣壺的例子來描述:“委托是什麼”。實際上,賣家委托快遞送貨,需要如下一些代碼:
“委托是什麼”這個問題是表象,實際上它還隱藏著5個小問題:
1:委托聲明是什麼?
2:委托變量是什麼?
3:什麼是委托變量賦值?
4:什麼是委托處理器?
5:如何調用委托?
在上圖代碼中,這5個小問題的序號正好對應了圖中的數字部分,
首先,程序得有一個地方聲明委托;
其次,賣家自己還得定義一個委托變量;
再次,通過某種形式給賣家的委托變量賦值,這個值是什麼呢,就是一個委托處理器的“引用”。委托處理器就是一個方法,所以,賦值的過程,就是將方法的引用賦值給委托變量。
最後,調用委托,實際上,就是使用委托變量。
備注,要注意的是,委托聲明和委托處理器的返回值和參數必須保持一致。
四:委托本質上是什麼?
上文我們闡述了委托是什麼,實際我們僅僅闡述的是委托的表象是什麼,那麼,委托本質上是什麼呢?
到現在為止,我們已經學過了兩個類型的概念:類和枚舉。我們在這裡要強調的是,上文代碼的委托聲明中的”SendProductHandler“實際上,是一個類,我們應該將其看為:
internal class SendProductHandler : System.MulticastDelegate
{
public SendProductHandler(object @object, IntPtr method)
{
}
public virtual IAsyncResult BeginInvoke(string product, AsyncCallback callback, object @object)
{
}
public virtual void EndInvoke(IAsyncResult result)
{
}
public virtual void Invoke(string product)
{
}
}
為什麼是這樣的呢,相信你看了下面的視頻就會明白。
五:視頻
非公開部分,請聯系最課程(www.zuikc.com)觀看。
六:事件是什麼?
知道了委托,我們來看事件,將小節”二:委托是什麼“中的代碼2和3處,修改為:
“委托”就變成“事件”了。
使用事件後,你可以為你的委托變量_sendProduct,增加多個方法,你看,代碼中的位置3處,不再是個“=”號,而是一個“+=”號了。