zoukankan      html  css  js  c++  java
  • .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);
    将来的你,一定会感谢现在努力的自己!
  • 相关阅读:
    HDU1565_方格取数(1)
    HDU3046_Pleasant sheep and big big wolf
    HDU4183_Pahom on Water
    「zoj2314」Reactor Cooling (无源汇上下界可行流)
    [ACM-ICPC 2018 沈阳网络赛] G. Spare Tire (思维+容斥)
    [ACM-ICPC 2018 沈阳网络赛] D. Made In Heaven (k短路模板)
    lct,半平面交,线性基,k短路
    P3950 部落冲突 (LCT暴力)
    P4219 [BJOI2014]大融合 ( LCT维护虚实子树size )
    P3203 [HNOI2010]弹飞绵羊(LCT维护链的size + 思维)
  • 原文地址:https://www.cnblogs.com/GreatPerson/p/11027149.html
Copyright © 2011-2022 走看看