委托声明及调用
//委托的声明 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);