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. 在要實現非同步呼叫的地方,通過上一步建立的物件來呼叫方法。
usingsystem;
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. 在適當的地方呼叫事件觸發方法觸發事件。
下面是乙個簡單的例子:
usingsystem;
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 ...