事件是利用委託來申明的,因此先解釋委託。委託是乙個類,它與其他類如int,string等沒有本質區別,int代表的是所有的整形,而string代表的是字串,委託則代表的是一類方法,這類方法具有相同返回型別和相同引數。委託的定義:
public delegate void calculatorhandler(int x,int y);
從calculatorhandler
這個委託的定義可以看出,它反應的是一類方法,這類方法的返回型別是
void
,兩個引數是
(int x,int y)
,因此以後所有具有這樣特徵的方法都可以用這個委託來代替,現有以下這個方法:
static void add(int x, int y)
",x+y);
}
首先要將這個方法賦值給這個委託才可以使用,就如普通的類賦值一樣,calculatorhandler calhandler = new calculatorhandler(add)
當然你也可以像給乙個整形賦值一樣,這樣賦值:
calculatorhandler calhander = add;
當要呼叫這個方法的時候,你可以就像使用方法一樣使用委託,
calhander(3,4);
委託也可以繫結多個方法,當呼叫這個委託時,會呼叫所有已經繫結了的方法,如現在還有這樣的方法:
static void multiply(int x, int y)
",x*y);
}
只需在calhandler基礎上多繫結個方法,具體語法:calhander += multiply;
這樣當呼叫
calhander(3,4);
會同時呼叫
add和multiply
這兩個方法,你也可以利用「
-=」解綁方法:
calhander -= multiply;
這樣再次呼叫這個委託,則只會呼叫
add這個方法。
一說到事件總會有發布者(publisher
)和訂閱者(
subscriber),
發布者定義了乙個事件,訂閱者訂閱該事件(指的是當該事件觸發時,訂閱者做出什麼樣的反應,即利用相應的函式去處理)。該函式的定義與定義該事件的委託配套。**如下:
public delegate void messageeventhandler();
class publisher
public void onmessageevent()}}
class subscriber
public void response()
} class program}}
這就是事件的基本用法,但是事件與委託到底有什麼區別呢,從上面的**可以看出,事件是根據委託來定義的,public event messageeventhandlermessageevent
,其實它是利用委託來規定訂閱者處理函式的型別(相同的返回型別和引數即為一類),然後可以方便在發布者自身的類中來觸發訂閱者的一些方法。
但是為什麼要事件呢,要實現這些,我僅用委託也可以實現呀,如下**:
public delegate void messageeventhandler();
class publisher
public void onmessageevent()}}
class subscriber
public void response()
}class program
}
這樣子也同樣可以產生相同的結果。但是當客戶端如下呼叫呢?
publisher p = new publisher();
subscriber s = new subscriber(p);
p.dosomething();
p.messageevent();
console.readkey();
客戶端是不是能隨意讓發布者產生事件,這個只有神才能做到呀!因此我們可否將發布者的委託定義為private
,因為只有發布者的內部才能觸發事件嘛,其他人怎麼可以?但是這樣訂閱者就無法訂閱了,那我們是否可以增加繫結可解除的函式來訂閱此委託呢?
public delegate void messageeventhandler();
class publisher
public void onmessageevent()
}public void add_messageevent(messageeventhandler m)
public void reomove_messageevent(messageeventhandler m)
}class subscriber
public void response()
}class program}}
這樣就可以實現與事件一樣的功能,因此為了方便微軟為我們提供了事件訪問器,何為事件訪問器?
public delegate void messageeventhandler();
class publisher
}remove}}
public void dosomething()
public void onmessageevent()}}
class subscriber
public void response()
}class program
}
以上的**就是利用事件訪問器來讓委託繫結訂閱者的方法,事件訪問器中的add和
remove
能自動編譯為+=和
-=。通過
reflector
,我們可以看到乙個事件是如何定義的:
它是申明乙個私有的委託另外利用兩個函式來繫結與解除訂閱者的方法。
private messageeventhandlermessageevent;
委託與事件的區別
用乙個公司的場景來說明。假如你是乙個公司的老闆,手下有兩名員工 有點少,呵呵 小張和小王。你給了小王乙個這樣的特權 如果小張玩遊戲,你就可以扣小王500元錢。這就是現實中的委託。在寫程式中,程式設計師就是老闆,小張和小王就是兩個物件。小張玩遊戲是乙個方法,小張還有乙個遊戲事件,他玩遊戲激發這個事件。...
委託與事件的區別
使用事件的 定義乙個類 class foo 定義乙個方法,呼叫委託 public void action class program 使用委託的方法 class foo 執行乙個方法方法 public void action class program 區別一 event可以多播 class foo...
C 委託與事件有啥區別?
一.委託和事件的差別在哪?請各位思考乙個問題,委託與事件功能幾乎相同,委託能幹的事件也能幹,反之亦然。那為啥還要分別弄出兩個來呢?如果你是在學校學的暈頭轉向的可憐兄弟,那就繼續c 教程往下看吧,別直接跳到三了 二.委託 說的直白一點,你可以把委託當c 中的函式指標來用。同返回值型別,同引數列表。舉個...