前幾天導員講了講委托的一些東西,今天在這裡小結一下。
委托:
C#中一切都是對象,整數可以用整數變量指向它,對象可以用對象變量指向它,函數也可以用委托變量指向它。
聲明委托的方式:delegate 返回值類型 委托類型名(參數)
比如:delegate string DeleGet(sring att)
注意:這裡除了委托關鍵字delegate,後面的返回值類型(例子中的第一個string)和參數(例子中的string att)要和委托的函數一致。DeleGet是委托類型名,不是函數名
聲明的委托是一種類型,和int、string一樣,如果要用的話還需要聲明委托類的變量,聲明委托類型變量的方式:DeleGet f1;
將委托變量指向函數:DeleGet f1=new DeleGet(SayHello); (或者簡寫DeleGet f1=SayHello; ),這樣就可以像調用普通函數一樣把f1當成函數。委托可以看成是函數的指針。
在給一個委托變量添加一個函數後,還可以添加多個:f1+=SayBay; ,這樣就形成了一個委托鏈,當執行這個委托變量的時候就會執行委托變量指向的一個或多個方法。同樣的f1-=SayBay;就是移除委托變量中的方法。
事件:
事件語法:event ProcessWordDelegate OnWord;
加了event關鍵字實現事件機制的好處:用了event事件,不可以修改事件已經注冊的值;不可以冒充進行事件通知了。在IntUC類外部就不能通過OnIntInput(3)的方式調用注冊的委托了。只能+=、-=!對比“事件1”、“事件2”兩個項目區別,“事件和委托的區別”就都明白了!
委托和事件沒有可比性,因為委托是類型,事件是屬性(對象),下面說的是委托的對象(用委托方式實現的事件)和(標准的event方式實現)事件的區別。事件的內部是用委托實現的。
因為對於事件來講,外部只能“注冊自己+=、注銷自己-=”,外界不可以注銷其他的注冊者,外界不可以主動觸發事件,因此如果用Delegate就沒法進行上面的控制,因此誕生了事件這種語法。
事件是用來閹割委托實例的,類比用一個自定義類閹割List。事件只能add、remove自己,不能賦值。事件只能+=、-=,不能=
event會自動生成一個delegate變量和兩個函數: add和remove,C#編譯器用這兩個方法支持+=和-=操作符 (*)
public event MyDelegate OnEvent;
內部實現是(不嚴格的解釋)
private MyDelegate OnEvent;
public void Add(MyDelegate d)
{
OnEvent+=d;
}
public void Remove(yDelegate d)
{
OnEvent-=d;
}
因為OnEvent是private的,所以在類外部不能OnEvent(1)觸發事件,但是在類內部可以。
public的方法只有Add和Remove,所以只能+=、-=,其他的操作都是不可以的。