1、定义委托:委托是一个特殊的类,委托能够将方法当成参数传递,委托的关键字是delegate。spa
2、委托三部曲日志
1.声明委托code
1 /// <summary> 2 /// 声明没有返回值且有一个参数为String类型的委托 3 /// </summary> 4 /// <param name="name"></param> 5 public delegate void SayHiDelegate(string name);
2.实例化委托blog
1 SayHiDelegate sayHiDelegate = new SayHiDelegate(SayHiChinese); //2.委托实例化 string
3.调用委托,而且传参数it
1 //3.调用委托 2 var name = "刘辉华"; 3 SayHiMethodDelegate(name, sayHiDelegate);
3、为何要用委托。写到这里咱们先看个下面一个问题:io
模拟场景:1.一个中国打招呼说:您好 2.如今来了个美国人打招呼说:hi 3.若是再来个法国人,日本人.... class
那么有的人就开始说了,能够用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方法里面就会有重复的代码。
下面咱们用最完美的委托来解决这些问题,其实很简单:static
/// <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);