一、定义委托:委托是一个特殊的类,委托可以将方法当成参数传递,委托的关键字是delegate。
二、委托三部曲
1.声明委托
1 /// <summary> 2 /// 声明没有返回值且有一个参数为String类型的委托 3 /// </summary> 4 /// <param name="name"></param> 5 public delegate void SayHiDelegate(string name);
2.实例化委托
1 SayHiDelegate sayHiDelegate = new SayHiDelegate(SayHiChinese); //2.委托实例化
3.调用委托,并且传参数
1 //3.调用委托 2 var name = "刘辉华"; 3 SayHiMethodDelegate(name, sayHiDelegate);
三、为什么要用委托。写到这里我们先看个下面一个问题:
模拟场景:1.一个中国打招呼说:您好 2.现在来了个美国人打招呼说:hi 3.如果再来个法国人,日本人....
那么有的人就开始说了,可以用IF判断呀。说的没错,代码如下:
1 public static void SayHiChinese(string name) 2 { 3 //记录日志(重复代码) 4 Console.WriteLine("记录日志功能"); 5 Console.WriteLine($"{name}说:你好"); 6 } 7 8 public static void SayHiAmerican(string name) 9 { 10 //记录日志(重复代码) 11 Console.WriteLine("记录日志功能"); 12 Console.WriteLine($"{name}说:hi"); 13 } 14 15 public static void SayHi(string name, Language language) 16 { 17 switch (language) 18 { 19 case Language.Chinese: 20 SayHiChinese(name); 21 break; 22 case Language.American: 23 SayHiAmerican(name); 24 break; 25 default: 26 throw new Exception("没有这个国家的人中"); 27 } 28 }
1 System.Console.WriteLine("IF 判断"); 2 //实例化委托 3 SayHiDelegate sayHiChinese = new SayHiDelegate(People.SayHiChinese); 4 //调用委托 5 string name = "小强"; 6 sayHiChinese.Invoke(name); 7 8 //实例化委托 9 SayHiDelegate syHiAmerican = new SayHiDelegate(People.SayHiAmerican); 10 //调用委托 11 string nameEn = "Json"; 12 syHiAmerican.Invoke(nameEn);
我这里只写了两个国家的人说两种语言,那么如果我在加一个国家的人说的语言势必会更改方法,这样就违背了开闭原则。如果要在每个国家的SayHi方法里面加入日志的话,两个国家的SayHi方法里面就会有重复的代码。
下面我们用最完美的委托来解决这些问题,其实很简单:
/// <summary> /// 委托方法 /// </summary> /// <param name="name"></param> /// <param name="sayHi"></param> public static void SayHiCommonMethod(string name, SayHiDelegate sayHi) { //记录日志(重复代码) Console.WriteLine("记录日志功能"); sayHi.Invoke(name); } //调用委托 string nameEn = "Json"; //调用委托 string name = "小强"; People.SayHiCommonMethod(name, People.SayHiChinese); People.SayHiCommonMethod(nameEn, People.SayHiAmerican);