C 委託和事件詳解

2021-09-13 17:17:47 字數 1902 閱讀 5030

委託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.的函式委託到另乙個元素 一般來講,會把乙個或者一組元素的事件委託到它的父層或者更外層元素上,真正繫結事件的是外層元素,當事件響應到需要繫結的元素上時,會通過事件冒泡機制從而觸發它的外層元素的繫結事件上,然後在外層元素...