//委託的聲明 public delegate void NoReturnNoPara(); public delegate void NoReturnWithPara(int x,int y); public delegate string NoPara(); public delegate DateTime WithPara(string name,int size); NoReturnWithPara method = new NoReturnWithPara(ShowAdd);
//由於在靜態類中,因此調用的也必須爲靜態類 //調用的也必須跟其聲明時的返回類型和參數必須一致 NoReturnWithPara method1 = ShowAdd; // 能夠直接將方法賦值給聲明的委託 method.Invoke(4, 3);//委託的調用1 method(4, 5);//委託的調用2 method.BeginInvoke(6, 7, null, null);//異步調用 public static void ShowAdd(int x,int y) { Console.WriteLine("這裏是ShowAdd x = {0} y = {1}",x,y); }
*************************************************************************
委託可用於解耦
例子,如碰見人打招呼時,分爲美國人和中國人,說話的方式不同
那麼普通方法遍以下:
public static void Greeting(string name,PeopleType type)//傳遞值,根據值來決定行爲 { if(type == PeopleType.Chinese) { Console.WriteLine("{0},早上好!", name); } else if(type == PeopleType.English) { Console.WriteLine("{0},Good Morning!", name); } else { throw new Exception("wrong PeopleType"); } } public enum PeopleType { Chinese, English }
而咱們能夠經過委託來傳遞第二個參數值,這樣咱們擴展時,只需在GreetingClass類中添加方法,並對應調用就行。
GreetingHandler handler = new GreetingHandler(GreetingClass.GreetingEnglish);
public static void GreetingChinese(string name)//方法1的聲明,即調用的參數 { Console.WriteLine("{0},早上好!", name); } public static void GreetingEnglish(string name)//方法2的聲明,即調用的參數 { Console.WriteLine("{0},Good Morning!", name); } public static void Greeting(string name,GreetingHandler handler)//傳個方法給我,我去執行 { handler.Invoke(name); } public delegate void GreetingHandler(string name);//委託聲明 GreetingHandler handler = new GreetingHandler(GreetingClass.GreetingEnglish);//調用,GreetingClass.GreetingEnglish,GreetingClass類下的GreetingEnglish方法 GreetingClass.Greeting("韓非子", handler);