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);
    将来的你,一定会感谢现在努力的自己!
  • 相关阅读:
    js 数组方法比较
    js 知识点
    vuex、redux、mobx 对比
    读SRE Google运维解密有感(二)
    读SRE Google运维解密有感(一)
    001_深度剖析什么是 SLI、SLO和SLA?
    006_mac osx 应用跨屏幕
    005_ss-link.info的ping探测工具
    015_sublime插件管理及所有非常有用插件
    001_软件waf
  • 原文地址:https://www.cnblogs.com/GreatPerson/p/11027149.html
Copyright © 2011-2022 走看看