委託(delegate)是一種特殊的引用型別,它將方法作為特殊的物件封裝起來,從而將方法作為變數或者引數進行傳遞。
1//定義乙個委託型別deltype。注意delegate關鍵字後要說明委託的返回型別和引數型別
2public
delegate
void deltype(double x, double
y);3
//建立deltype委託型別的乙個例項deltpe
4deltype deltp;5//
將指定的方法封裝到該委託物件中,注意該方法的引數列表和返回型別都必須和委託的定義保持一致
6 deltp=new deltype(sub);//
c#還允許 deltype deltp=sub7//
最後通過委託物件來呼叫指定的方法
8 deltp(a,b);
委託呼叫靜態方法、非靜態方法:
呼叫當前類的靜態方法--在建立表示式中只需寫出方法名;
deltype deltp=new deltype(sub);
呼叫外部型別的靜態方法--應該寫出方法所屬的型別;
deltype deltp=new deltype(program.sub);
呼叫非靜態方法--應該指出方法所屬的物件名;
deltype deltp=new deltype(pro.sub);
委託的加減運算:
乙個委託物件可以封裝多個方法,通過委託物件的相加(合併)來實現。
deltype deltp1=new deltype(sub);
deltype deltp2=new deltype(mul);
deltype deltp3=deltp1+deltp2;
委託的合併還可以使用復合賦值操作符
detype deltp=mul;
deltp+=div;
委託的刪除
deltp3-deltp3-deltp2;
參加加減運算的委託物件必須屬於同乙個委託型別,另一層含義就是參與合併或刪除額方法的引數和返回型別必需完全一致。
如果委託物件全部刪除之後,最後得到的是乙個空的委託物件null,通過其進行方法呼叫會引發程式異常。
delegate型別
c#中定義的所有的委託型別實際上都是.net類庫中delegate類的派生類。不過delegate類是抽象類,不能建立例項;而且c#編譯器不允許顯式定義delegate的派生類,而是必須通過delegate關鍵字來建立委託型別。
delegate的幾個成員方法:
dynamicinvoke:呼叫委託物件所封裝的方法;它使用的是乙個params object型別的陣列型引數,因此無論將什麼引數傳遞給該方法都能通過編譯,但執行時可能發生錯誤。
getinvokationlist:返回乙個delegate陣列,通過它可以得到所包含的委託物件列表。
事件處理
public event deltype deltp;
使用event關鍵字實現事件可靠的訂閱發布。
使用eventhandler類
在事件發布和訂閱的過程中,定義事件的原型委託型別常常是一件重複性的工作。為此,.net類庫中定義乙個eventhandler委託型別。該委託的定義為:
public delegate void eventhandler(object sender,eventargs e);
其中object型別的引數sender表示引發事件的物件。由於事件型別成員只能由型別本身觸發,因此在觸發時傳遞給該引數的值通常為this。
第二個引數e表示事件中包含的資料。
委託和事件
主要過程如下 1.在後台 中,我們可以定義處理程式方法alartrang 2.然後定義委託,引用到處理程式方法的例項。3.最後將委託新增到事件中。從而,引發事件時就會呼叫相關的事件處理方法。若要使用在另乙個類中定義的事件,必須定義和註冊乙個事件處理程式。事件 處理程式必須具有與為事件宣告的委託相同的...
委託和事件
委託的宣告 public delegate void mydelegate string str 注1.委託的定義和方法的定義類似,只是在前面加了乙個delegate,但委託不是方法,它是一種型別。是一種特殊的型別,看成是一種新的物件型別比較好理解。用於對與該委託有相 同簽名的方法呼叫。2.委託相當...
事件和委託
事件是物件傳送的訊息,以發訊號通知操作的發生。操作可能是由使用者互動 例如滑鼠單擊 引起的,也可能是由某些其他的程式邏輯觸發的。引發事件的物件稱為事件傳送方。捕獲事件並對其作出響應的物件叫做事件接收方。在事件通訊中,事件傳送方類不知道哪個物件或方法將接收到 處理 它引發的事件。所需要的是在源和接收方...