.NET初识委托

一、定义委托:委托是一个特殊的类,委托可以将方法当成参数传递,委托的关键字是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);

猜你喜欢

转载自www.cnblogs.com/GreatPerson/p/11027149.html