委托声明及调用

//委托的声明
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
}
View Code
而我们可以通过委托来传递第二个参数值,这样我们扩展时,只需在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);
View Code

 

posted @ 2017-02-27 20:27  _Nestling  阅读(588)  评论(0编辑  收藏  举报