委託例項(delegate例項 事件委託通知)

2021-05-23 21:11:29 字數 2440 閱讀 3723

delegate例項

delegate是c#中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名 (signature),並且它只能持有與它的簽名相匹配的方法的引用。它所實現的功能與c/c++中的函式指標十分相似。它允許你傳遞乙個類a的方法m 給另乙個類b的物件,使得類b的物件能夠呼叫這個方法m。但與函式指標相比,delegate有許多函式指標不具備的優點。首先,函式指標只能指向靜態函 數,而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}}

c#用委託來實現事件通知機制

委託相當與c++函式指標。整個過程涉及乙個呼叫者,乙個被呼叫者,還有就是這個委託。

- 實現步驟

有以下幾步: 1. 申明委託, 2.定義呼叫者和呼叫的函式, 3.定義被呼叫者和具體實現的函式(被呼叫的函式)

1.申明委託 ,在包裡或者類裡,public

public delegate void playgame(object sender, eventargs e);

2.定義呼叫者(類letsgame)和呼叫委託的函式,在呼叫者裡要有委託的例項(呼叫者扔出乙個委託,被呼叫者給這個委託賦值)

class letsgame

}3. 定義被呼叫者(類ms)和具體實現的函式(被呼叫的函式),也就是concrete class的實現或者叫函式指標例項。打個比方,在乙個叫ms的類中實現.ms中對呼叫者中委託的例項進行賦值.

class ms

public void msplaygame(object sender, eventargs e)

}這樣當呼叫letsgame.startplay的時候就會呼叫ms.msplaygame.

委託例項化

新建立的委託例項將引用以下各項中的乙個 委託建立表示式中引用的靜態方法。委託建立表示式中引用的目標物件 此物件不能為null 和例項方法。另乙個委託。例如 delegate void d int x class c public void m2 int i class test 委託例項一旦被例項化...

C 委託例項

委託是乙個特殊的類,它定義了方法的型別,可以將方法當作另乙個方法的引數來進行傳遞,這種方法動態地賦給引數的做法,可以避免在程式中大量使用if else switch 語句,同時也使得程式具有更好的擴充套件性。委託機制尤其適合在使用事件處理的程式設計模式或者類的靜態方法,以及在需要封裝和靈活的組織方法...

委託應用例項

需求 根據傳入的action引數,自動構造與之對應的request。直接上 先定義乙個myrequest類。下有子類 addrequest,loadrequest,deleterequest。myrequest 1 public class myrequest24 public gridpagerp...