真的是学了无数次的委托了,直到现在才深刻的领悟!!
先定义一个委托,实现5个参数相乘:
delegate void MeDelegate(int para1, int para2,int para3, int para4,int para5);
static void Main(string[] args)
{
MeDelegate d;
d = new MeDelegate(new Program().Ride);
MyMethod(d);
Console.ReadKey();
}
private void Ride(int para1, int para2, int para3, int para4, int para5)
{
int sum = para1 * para2 * para3 * para4 * para5;
Console.WriteLine(sum);
}
private static void MyMethod(MeDelegate d)
{
d(7, 12, 23, 51, 3);
}
根据以上例子,可以自己试着改为两个参数相加,来深刻理解一下委托 。 注意:委托要定义为void 类型
为什么要使用委托? 而不直接调用方法呢?
委托使得一个方法可以作为另一个方法的参数进行传递
看一个我在书上看到的例子:
//接收主函数传过来的参数,进行输出
public static void Greeting(string name,string language)
{
switch (language)
{
case "zhcn":
ChineseGreeting(name);
break;
case "englis":
EnglisGreeting(name);
break;
default:
EnglisGreeting(name);
break;
}
}
//英国人打招呼
private static void EnglisGreeting(string name)
{
Console.WriteLine("hello__________" + name);
}
//中国人打招呼
private static void ChineseGreeting(string name)
{
Console.WriteLine("ni hao_________" + name);
}
//主函数
static void Main(string[] args)
{
Greeting("zhongguoren", "zhcn");
Console.ReadKey();
}
现在是两个国家,将来如果有美国、德国、日本等,就需要在程序中进行添加。
根据前两段代码进行修改,做成委托的形式 :
static void Main(string[] args)
{
MyDelegate d;
d = new MyDelegate(new Program().GetContent);
MyStartUser(d);
Console.ReadKey();
}
private static void MyStartUser(MyDelegate d)
{
d("china", "chinese"); //这个d是方法,作为参数传到了这
}
private void GetContent(string p1, string p2)
{
Console.WriteLine(p1+"________"+p2);
}
委托提高了方法的扩展性。
同理看下这个是书上的实现-相对复杂:
public delegate void MyDelegate(string name);
public static void Main(string[] args)
{
Program p = new Program();
p.Greeting("navy",p.AmericeGreeting);
p.Greeting("jiaoni", p.ChinaGreeting);
Console.ReadKey();
}
private void ChinaGreeting(string name)
{
Console.Write("nihao", name);
}
private void AmericeGreeting(string name)
{
Console.Write("hello", name);
}
public void Greeting(string name, MyDelegate callback)
{
callback(name);
}