委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if-else(switch)語句,同時使得程式具有更好的可擴充套件性。
委託不同於string的乙個特性:可以將多個方法賦給同乙個委託,或者叫將多個方法繫結到同乙個委託,當呼叫這個委託的時候,將依次呼叫其所繫結的方法
使用委託可以將多個方法繫結到同乙個委託變數,當呼叫此變數時(這裡用「呼叫」這個詞,是因為此變數代表乙個方法),可以依次呼叫所有繫結的方法
using物件導向化設計system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
delegatedemo
public
static
void englishgreeting(string
name)
public
static
void chinesegreeting(string
name)
static
void main(string
args)}}
委託為什麼不能宣告為private:usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
consoledemo
//方法改寫 傳遞過來的是委託的名稱
public
void greetpeople(string
name)}}
class
programtwo
private
static
void chinesegreeting(string
name)
static
void main(string
args)}}
因為宣告委託的目的就是為了把它暴露在類的客戶端進行方法的註冊,你把它宣告為private了,客戶端對它根本就不可見,那它還有什麼用?
宣告為public型別的好處:
在客戶端可以對它進行隨意的賦值等操作,嚴重破壞物件的封裝性
如果是string型別看做是委託你怎麼辦:
答案是使用屬性對欄位進行封裝。
使用委託的時候第乙個方法註冊用「=」,是賦值語法,因為要進行例項化,第二個方法註冊則用的是「+=」的終極體驗:
event,它封裝了委託型別的變數,使得:在類的內部,不管你宣告它是public還是protected,它總是private的。
在類的外部,註冊「+=」和登出「-=」的訪問限定符與你在宣告事件時使用的訪問符相同
在greetingmanager類中新增如下**
//類中public
event
greetingdelegate makegreet;
//main方法中 //
gm.makegreet = englishgreeting;
//錯誤 1 事件「consoledemo.greetingmanager.makegreet」只能出現在 += 或 -= 的左邊(從型別「consoledemo.greetingmanager」中使用時除外)
private greetingdelegate makegreet; //對事件的宣告 實際是 宣告乙個私有的委託變數makegreet事件確實是乙個greetingdelegate型別的委託,只不過不管是不是宣告為public,它總是被宣告為private[methodimpl(methodimploptions.synchronized)]
public void add_makegreet(greetingdelegate value)
[methodimpl(methodimploptions.synchronized)]
public void remove_makegreet(greetingdelegate value)
另外,它還有兩個方法,分別是add_makegreet和remove_makegreet,這兩個方法分別用於註冊委託型別的方法和取消註冊。
實際上也就是: 「+= 」對應 add_makegreet,「-=」對應remove_makegreet。而這兩個方法的訪問限制取決於宣告事件時的訪問限制符
在add_makegreet()方法內部,實際上呼叫了system.delegate的combine()靜態方法,這個方法用於將當前的變數新增到委託鍊錶中。
我們前面提到過兩次,說委託實際上是乙個類,在我們定義委託的時候:public delegate void greetingdelegate(string name);
當編譯器遇到這段**的時候,會生成下面這樣乙個完整的類:
public參考乙個小程式理解下事件和委託結合使用sealed
class
greetingdelegate:system.multicastdelegate
大綱圖如下:
myeventsource 3.引發事件的類 事件 在內部觸發,外部繫結
myeventargs - class 1.提供事件資料的類
myeventhandler - delegate 2.事件委託
myeventlistener 監聽事件的類
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
consoledemo
}//在myeventsource中新增的委託和事件
public
delegate
void myeventhandler(object sender, myeventargs e);//
2.事件委託
public
event myeventhandler myevent;//
宣告乙個事件
public
void onmyevent(string keytoraiseevent)//
引發事件的方法 只有此方法呼叫的時候才會進行控制台輸出 在內部觸發,外部繫結
else}}
//監聽事件的類 感覺這個類狠多餘
public
class
myeventlistener
,所按的鍵為:
", sender, e.keytoraiseevent);
}//訂閱事件
public
void
subsribe(myeventsource eventsource)
//取消訂閱事件
public
void
unsubsribe(myeventsource eventsource)
}class
program
}}
c 委託事件
1,什麼是委託 委託是什麼?從生活理解就像是你是乙個c 程式設計師,你對c 並不了解,當需要進行c 分析的時候你委託給你的一位懂c 的同事幫你來完成 在c 中,委託的作用是這樣描述的 委託就像乙個函式的指標,在程式執行時可以使用它們來呼叫不同的函式。簡單點說,委託能夠引用函式,通過傳遞位址的機制完成...
C 委託事件
一 委託 委託類似於函式指標,但函式指標只能引用靜態方法,而委託既能引用靜態方法,也能引用例項方法。委託使用分三步 1 委託宣告。2 委託例項化。3 委託呼叫。例程一 程式 using system namespace 委託 private int add int num1,int num2 例中,...
C 委託事件
1 namespace222 2324 25 26 建立執行方法 27 28 29 30 31static int stratrun int count,int num count num 3233 34 35 第一步宣告委託 36 37 計算前的總數 38 數字39 計算後的總數 40public...