C 事件與委託詳解

2022-03-11 03:53:01 字數 2805 閱讀 7566

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

mydelegatetest

public

static

void

main()

}

輸出結果是:hello, sam1111

了解了delegate,下面我們來看看,在c#中對事件是如何處理的。

c#中的事件處理實際上是一種具有特殊簽名的delegate,象下面這個樣子:

public delegate void myeventhandler(object sender, myeventargs e);

其中的兩個引數,sender代表事件傳送者,e是事件引數類。myeventargs類用來包含與事件相關的資料,所有的事件引數類都必須從system.eventargs類派生。當然,如果你的事件不含引數,那麼可以直接用system.eventargs類作為引數。

就是這麼簡單,結合delegate的實現,我們可以將自定義事件的實現歸結為以下幾步:

1.定義delegate物件型別,它有兩個引數,第乙個引數是事件傳送者物件,第二個引數是事件引數類物件。

2.定義事件引數類,此類應當從system.eventargs類派生。如果事件不帶引數,這一步可以省略。

3.定義"事件處理方法,它應當與delegate物件具有相同的引數和返回值型別"。

4.用event關鍵字定義事件物件,它同時也是乙個delegate物件。

5.用+=操作符新增事件到事件佇列中(-=操作符能夠將事件從佇列中刪除)。

6.在需要觸發事件的地方用呼叫delegate的方式寫事件觸發方法。一般來說,此方法應為protected訪問限制,既不能以public方式呼叫,但可以被子類繼承。名字是oneventname。

7. 在適當的地方呼叫事件觸發方法觸發事件。

下面是乙個簡單的例子:

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年元旦午夜時分到達。

C 委託與事件詳解 三

protected void btnsearch click object sender,imageclickeventargs e 那他們到底表示什麼呢?在回答上面的問題之前,我們先搞懂 net framework的編碼規範 一 委託型別的名稱都應該以eventhandler結束。二 委託的原型定...

C 委託和事件詳解

委託delegate delegate是c 中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名 signature 並且它 只能持有與它的簽名相匹配的方法的引用 它所實現的功能與c c 中的函式指標十分相似。它允許你傳遞乙個類a的方法m給另乙...

c 委託與事件

c 委託與事件 心得 c 用委託來實現事件通知機制。委託相當與c 函式指標。整個過程涉及乙個呼叫者,乙個被呼叫者,還有就是這個委託。實現步驟有以下幾步 1.申明委託,2.定義呼叫者和呼叫的函式,3.定義被呼叫者和具體實現的函式 被呼叫的函式 1.申明委託 在包裡或者類裡,public public ...