委託和事件

2022-07-29 05:03:12 字數 2503 閱讀 6317

委託實現了型別安全的回掉方法,在.net中**無處不在,所以委託也無處不在,事件模型建立在委託機制上,本文將完成一次關於委託的旅行,全面闡述委託及其核心話題,逐一梳理委託、委託鏈、事件等。

關於委託

了解委託先從其定義開始,通常乙個委託被宣告為:

public delegate void calculatedelegate(int x,int y);

關鍵字delegate用於宣告乙個委託型別calculatedelegate,可以對其新增訪問修飾符,預設其返回型別為void,接受兩個int型別的引數x和y,但是委託並不等於方法,而是一種引用型別,類似c++中的函式指標,指向乙個方法。

下面的示例將介紹如何通過委託來實現乙個計算器模擬程式,在基礎上來了解關於委託的定義、建立和應用:

public

class

delegatedemo   

//定義委託型別的變數

private

calculatedelegate mydelegate;   

public

void

begincalcualte()

}

上述示例中,在delegatedemo類中宣告了乙個calculatedelegate的委託型別,它具有和繫結方法add完全相同的返回型別和引數,否則無法通過編譯,將方法傳給calculatedelegate的構造器,也就是將方法指派給委託calculatedelegate委託,並將該引用賦給mydelegate變數,也就表示mydelegate變數儲存指向了add方法的引用,以此實現對add的**。

由此可見,委託表示了對其**方法的簽名,可以將方法當作引數來傳遞,並根據傳入的方法來動態的呼叫方法,所以,只要提供和委託具有相同簽名的方法就可以與委託繫結,例如:

public void sub(int32 x, int32 y)

同樣可以將sub分配給委託,如下:

// 委託繫結

mydelegate = new calculatedelegate(sub);

//呼叫委託

mydelegate(2, 1);

多播委託委託鏈

在上述委託的實現中,add方法和sub方法可以繫結到同乙個型別的委託上,那麼它們可不可以繫結到同乙個委託變數上呢?答案是可以,多個方法可以繫結到同乙個委託變數上,在委託變數做**的時候可以依次執行其繫結的方法,這種技術稱為多播委託。在.net中提供了相當簡潔的語法類建立委託鏈,以+=和-=操作符來分別進行繫結和解除繫結操作,多個方法繫結到同乙個委託變數就形成了一條委託鏈,對其呼叫時會以此呼叫所有繫結的**方法。例如:

public void begincalcualte()

計算結果為 :210 112

再以-=來解除繫結

mydelegate -= new calculatedelegate(sub);
//呼叫委託

mydelegate(211, 99);

計算結果為:310,可見通過-=操作,解除了sub方法。

事實上+=和-=操作分別呼叫了delegate.combine和delegate.remove方法,委託本質上仍然是乙個類,如此簡潔的語法正式因為clr和編譯在後台完成了一系列操作。

.net的事件模型建立在委託的機制上,可以說事件是對委託的封裝,從委託的示例中可知,在客戶端可以隨意對委託進行操作,一定程度上破化了物件導向的封裝機制,因此事件實現了對委託的封裝。

下面通過將委託的示例進行改造,來完成乙個事件的定義過程:

public class calculator

}//宣告事件委託

public delegate void calculateeventhander(object sender,calculateeventargs e);

//定義事件成員 提供外部繫結

public event calculateeventhander mycalculate;

protected virtual void oncalculate(calculateeventargs e)

}//進行計算,呼叫該方法表示有新的計算發生

public void calculate(int32 x, int32 y)

}

示例中,對計算器模擬程式做了簡要修改,從二者的對比中可以體會出事件的完整定義過程,主要包括:

乙個事件的完整程式就這樣定義好了,然後還需要定義乙個事件觸發程式用來監聽事件:

public class calculatemanager

public void sub(object sender, calculator.calculateeventargs e)

}

最後,在客戶端 實現事件處理程式:

static void main(string args)

如果對設計模式有所了解,上述實現過程實質是觀察者模式在委託中的應用。

委託和事件

主要過程如下 1.在後台 中,我們可以定義處理程式方法alartrang 2.然後定義委託,引用到處理程式方法的例項。3.最後將委託新增到事件中。從而,引發事件時就會呼叫相關的事件處理方法。若要使用在另乙個類中定義的事件,必須定義和註冊乙個事件處理程式。事件 處理程式必須具有與為事件宣告的委託相同的...

委託和事件

委託的宣告 public delegate void mydelegate string str 注1.委託的定義和方法的定義類似,只是在前面加了乙個delegate,但委託不是方法,它是一種型別。是一種特殊的型別,看成是一種新的物件型別比較好理解。用於對與該委託有相 同簽名的方法呼叫。2.委託相當...

事件和委託

事件是物件傳送的訊息,以發訊號通知操作的發生。操作可能是由使用者互動 例如滑鼠單擊 引起的,也可能是由某些其他的程式邏輯觸發的。引發事件的物件稱為事件傳送方。捕獲事件並對其作出響應的物件叫做事件接收方。在事件通訊中,事件傳送方類不知道哪個物件或方法將接收到 處理 它引發的事件。所需要的是在源和接收方...