前面一篇已经讲述了为什么使用委托,以及使用委托有什么好处,今天再此学习张子扬博客逐步了解委托。
1. 方法作为方法的参数
这个看起来很别扭,和C++中出现函数指针有点类似,只是函数参数是一个指针而已。
public void GreetPeople(string name, *** MakeGreeting)
***只是这个指针类型而已;
首先:
1 public void chineseGreet(string name) 2 { 3 Console.WriteLine("{0} 你好 ", name); 4 } 5 public void englishGreet(string name) 6 { 7 Console.WriteLine("{0} Hello", name); 8 } 9 public enum Language 10 { 11 English, Chinese 12 } 13 14 public void GreetPeople(string name, Language lang) 15 { 16 //做某些额外的事情,比如初始化之类,此处略 17 swith(lang) 18 { 19 case Language.English: 20 EnglishGreeting(name); 21 break; 22 case Language.Chinese: 23 ChineseGreeting(name); 24 break; 25 } 26 }
上述就是两个语种的打招呼语句,但如果是多种语言,就必须写足够多方法,有点费事,
为解决上述麻烦,委托就可以使用:
public delegate void greet(string name);
看到上述声明,其相比于之前定义方法,只是多了 delegate,其余得如参数,返回值类型都完全一致;
现在可以重新定义:
public void GreetPeople(string name,GreetingDelegate MakeGreeting)
将委托作为了方法参数;
下面是完整代码:
namespace Delegate { //定义委托,它定义了可以代表的方法的类型 public delegate void GreetingDelegate(string name); class Program { private static void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } private static void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); } //注意此方法,它接受一个GreetingDelegate类型的方法作为参数 private static void GreetPeople(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); } static void Main(string[] args) { GreetPeople("Jimmy Zhang", EnglishGreeting); //这两行代码的使用,是如何调用委托,相比于switch语句简洁性 GreetPeople("张子阳", ChineseGreeting); Console.ReadKey(); } } }
2. 方法绑定委托
如前文所述,委托既然可以作为类,那就可以定义一个变量像普通变量一样完成赋值初始化,
GreetingDelegate delegate1, delegate2; delegate1 = EnglishGreeting; delegate2 = ChineseGreeting;
但委托变量又不像普通变量一样,它可以绑定多个方法;
GreetingDelegate delegate1; delegate1 = EnglishGreeting; // 先给委托类型的变量赋值 delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
也可以new一个出来;
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
下面是自己针对前文所学写的,学会使用委托,以及定义,赋值,绑定,以 new委托变量完成初始化:
public class greetClass { public void chineseGreet(string name) { Console.WriteLine("{0} 你好 ", name); } public void englishGreet(string name) { Console.WriteLine("{0} Hello", name); } } public delegate void greet(string name); /// <summary> /// 纯粹是为了将委托作为函数参数使用 /// </summary> public class greetDelegate { public void makeGreet(string name,greet greeting) { greeting(name); } } static void Main(string[] args) { greetClass k_greetClass = new greetClass(); greetDelegate g_greetDelegate = new greetDelegate(); //委托可以作为函数的参数,像C++中函数指针一样传递函数的地址即可,只是这里是引用而已 g_greetDelegate.makeGreet("洋洋", k_greetClass.chineseGreet); g_greetDelegate.makeGreet("Young", k_greetClass.englishGreet); //既然委托可以当作一个类,那们他就会对象,可以对对象进行初始化等 greet greetDelegate1, greetDelegate2;//两个委托型变量,下面两中方法,一个委托变量还可以绑定多个方法 greetDelegate1 = new greet(k_greetClass.chineseGreet); greetDelegate1 += k_greetClass.englishGreet; greetDelegate2 = k_greetClass.englishGreet; g_greetDelegate.makeGreet("洋洋", greetDelegate1); g_greetDelegate.makeGreet("Young", greetDelegate2); Console.ReadKey(); }