很多人說(shuō)C#和JAVA很像包竹,但也有很多地方不同龟再,委托就是一個(gè)C#特有的東西
委托可以理解為C語(yǔ)言里的函數(shù)指針,只要參數(shù)和返回類(lèi)型一致就可以指向它,但只有委托(delegate)是不夠的必須要配合事件(event)來(lái)完成
可以理解為委托只是把某個(gè)方法放進(jìn)去,然后賦值給事件,調(diào)用事件就是調(diào)用那個(gè)方法
舉個(gè)例子
首先新建一個(gè)類(lèi)
類(lèi)里寫(xiě)好委托和事件,還有要委托的方法(其實(shí)也可以在主類(lèi)里定義要委托的方法)
現(xiàn)在我寫(xiě)一個(gè)如果數(shù)值改變就反應(yīng)的類(lèi)
class EventTest{
private int value;
//只能委托參數(shù)和返回值都是空的方法
public delegate void NumManipulationHandler();
//ChangeNum只接受被NumManipulationHandler委托的方法
public event NumManipulationHandler ChangeNum;
public EventTest(int n){
SetValue(n);
}
protected void OnNumChange(){
//如果ChangeNum有委托方法則執(zhí)行委托方法,沒(méi)有就執(zhí)行else的內(nèi)容
if(ChangeNum!=null){
ChangeNum();
}else{
Console.WriteLine("Event fired!");
}
}
public void SetValue(int n){
//數(shù)字不同就調(diào)用OnNumChange方法
if(value!=n){
value=n;
OnNumChange();
}
}
//要委托的方法
public static void EventFired(){
Console.WriteLine("Bind Event Fired!");
}
}
然后在主的類(lèi)里委托
class Program
{
public static void Main(string[] args)
{
EventTest et=new EventTest(5);
et.SetValue(100);
//委托Eventtest的EventFired方法賦值給ChangeNum
et.ChangeNum+=new EventTest.NumManipulationHandler(EventTest.EventFired);
et.SetValue(50);
et.SetValue(60);
Console.ReadLine();
}
}
輸入結(jié)果
Event fired!
Event fired!
Bind Event Fired!
Bind Event Fired!
前兩個(gè)是沒(méi)有委托的剃盾,后面是有委托的