委託delegate
delegate是c#中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名(signature),並且它"只能持有與它的簽名相匹配的方法的引用"。它所實現的功能與c/c++中的函式指標十分相似。它允許你傳遞乙個類a的方法m給另乙個類b的物件,使得類b的物件能夠呼叫這個方法m。但與函式指標相比,delegate有許多函式委託和事件在 .net framework中的應用非常廣泛指標不具備的優點。首先,函式指標只能指向靜態函式,而delegate既可以引用靜態函式,又可以引用非靜態成員函式。在引用非靜態成員函式時,delegate不但儲存了對此函式入口指標的引用,而且還儲存了呼叫此函式的類例項的引用。其次,與函式指標相比,delegate是物件導向、型別安全、可靠的受控(managed)物件。也就是說,runtime能夠保證delegate指向乙個有效的方法,你無須擔心delegate會指向無效位址或者越界位址。
實現乙個delegate是很簡單的,通過以下3個步驟即可實現乙個delegate:
1. 宣告乙個delegate物件,它應當與你想要傳遞的方法具有相同的引數和返回值型別。
2. 建立delegate物件,並"將你想要傳遞的函式作為引數傳入"。
3. 在要實現非同步呼叫的地方,通過上一步建立的物件來呼叫方法。
下面是乙個簡單的例子
using system;
public class eventtest
}// 步驟4,用event關鍵字定義事件物件
private event myeventhandler myevent;
private myeventcls myecls;
public eventtest()
// 步驟6,以呼叫delegate的方式寫事件觸發函式
protected void onmyevent(system.eventargs e)
public void raiseevent()
public static void main()
else}}
輸出結果如下,紅色為使用者的輸入:
please input 『a』: a
my event is ok!
要建立乙個事件驅動的程式需要下面的步驟:
1. 宣告關於事件的委託;
2. 宣告事件;
3. 編寫觸發事件的函式;
4. 建立事件處理程式;
5. 註冊事件處理程式;
6. 在適當的條件下觸發事件。
現在我們來編寫乙個自定義事件的程式。主人養了一條忠實的看門狗,晚上主人睡覺的時候,狗負責看守房子。一旦有小偷進來,狗就發出乙個alarm事件,主人接到alarm事件後就會採取相應的行動。假設小偷於2023年元旦午夜時分到達。
//事件傳送者
class dog
}}//事件接收者
class host
//5.註冊事件處理程式
public host(dog dog)
}//6.現在來觸發事件
class program
//午夜零點小偷到達,看門狗引發alarm事件
console.writeline("/n月黑風高的午夜: " + now);
console.writeline("小偷悄悄地摸進了主人的屋內... ");
//建立事件引數
委託和事件 三 事件詳解
談到事件,不得不牽扯到兩個角色 事件發行者 publisher 乙個事件的發行者,也稱作是傳送者 sender 其實就是個物件,這個物件會自行維護本身的狀態資訊,當本身狀態資訊變動時,便觸發乙個事件,並通知說有的事件訂閱者。事件訂閱者 subscriber 對事件感興趣的物件,也稱為receiver...
C 事件與委託詳解
delegate delegate是c 中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名 signature 並且它只能持有與它的簽名相匹配的方法的引用。它所實現的功能與c c 中的函式指標十分相似。它允許你傳遞乙個類a的方法m給另乙個類b...
事件委託詳解
基本概念 事件委託,通俗地來講,就是把乙個元素響應事件 click keydown.的函式委託到另乙個元素 一般來講,會把乙個或者一組元素的事件委託到它的父層或者更外層元素上,真正繫結事件的是外層元素,當事件響應到需要繫結的元素上時,會通過事件冒泡機制從而觸發它的外層元素的繫結事件上,然後在外層元素...