zoukankan      html  css  js  c++  java
  • C# 委托Delegate(一) 基础介绍&用法

    本文是根据书本&网络 前人总结的。

    1. 前言

    定义&介绍:

    委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大佬使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性

    我们知道委托是一个引用类型,所以它具有引用类型所具有的通性。它保存的不是实际值,而是保存对存储在托管堆(managed heap)的对象的引用。那它保存的是对什么的引用呢?它保存的是对函数(function)的引用。

    首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。

    委托类:

    当我们用delegate关键字声明委托时,编译器自动为我们生成类。类的名字即为委托变量名,访问类型为定义的委托访问类型。如public delegate void CallBack(string name, int number);定义的委托对应的类为CallBack,访问类型为public,该类继承自[mscorlib]System.MulticastDelegate。如果我们定义委托的访问类型为private或者protected,则对应的委托类的访问类型为private或者protected。但是任何委托都继承自[mscorlib]System.MulticastDelegate。

    2. 委托演变代码

    1)我们创建一个类LanguageSpeak,多国说的语言,包括中文、英文、法文。与语言枚举,如下

        public enum Language
        {
            English, Chinese, Frank
        }
    
        public class LanguageSpeak
        {
            private void SpeakChinese(string name)
            {
                Console.WriteLine(name + " speak Chinese");
            }
    
            private void SpeakEnglish(string name)
            {
                Console.WriteLine(name + " speak English");
            }
    
            private void SpeakFrench(string name)
            {
                Console.WriteLine(name + " speak French");
            }       
    
        }

    现在,我们在类LanguageSpeak添加个方法,用来让不同人选择不同的语言。

    传入名字、语言。

            public void SpeakLanguage(string name, Language language)
            {
                switch (language)
                {
                 case Language.Chinese:
                        SpeakChinese(name);
                        break;
                 case Language.English:
                        SpeakEnglish(name);
                        break;
                 case Language.Frank:
                        SpeakFrench(name);
                        break;
                }
            }

    最后我们,在调用语言,达到不同人说不同语言的目的。

                  LanguageSpeak languageSpeak = new LanguageSpeak();
                languageSpeak.SpeakLanguage("陈桃", Language.Chinese);
                languageSpeak.SpeakLanguage("Allen", Language.English);
                languageSpeak.SpeakLanguage("Delavenay", Language.Frank);

    2)现在我们来看看,如果增加一种语言,比如粤语,要在语言类LanguageSpeak中添加一个方法,也要在SpeakLanguage方法与枚举中添加相应的语言判断。这样扩展性很差,现在,我们转变一种思维,用delegate委托的方式实现我们想要的结果。

    使用委托,枚举也不用了,看看以下要改变的代表是不是变得灵活性更加高了。

    第一步,在LanguageSpeak类添加委托声明

    public delegate void SpeakLanguageDelegate(string name);

    第二步,把方法

    public void SpeakLanguage(string name, Language language)

    改成

            public void SpeakLanguage(string name, SpeakLanguageDelegate speakLanguageDelegate)
            {
                speakLanguageDelegate(name);
            }

    最后,我们开始调用

                  LanguageSpeak languageSpeak = new LanguageSpeak();
                languageSpeak.SpeakLanguage("陈桃", languageSpeak.SpeakChinese);
                languageSpeak.SpeakLanguage("Allen", languageSpeak.SpeakEnglish);
                languageSpeak.SpeakLanguage("Orvde", languageSpeak.SpeakFrench);

    至此,我们看看,如果再增加一个国家语言,则在LanguageSpeak类中添加相应的方法,其他什么都不用改,也没有switch的判断。这就是delegate委托的魔性。

    下一节,我们更加深入的理解委托

    可以关注本人的公众号,多年经验的原创文章共享给大家。

  • 相关阅读:
    我对Web开发相关技术的认识过程
    JavaScript、JSP和Java之间的关系
    中断处理中的save_all、restore_all和iret
    实验五:Linux操作系统是如何工作的?破解操作系统的奥秘
    java CPU的乱序执行
    java缓存行对齐(缓存行二)
    解决ojdbc6升级ojdbc8中文乱码问题
    Caused by: java.lang.ClassNotFoundException: com.alibaba.dubbo.common.Version
    springSecurity5 重定向登录页面后 报错:尝试清除 Cookie.net::ERR_TOO_MANY_REDIRECTS status:200
    java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式
  • 原文地址:https://www.cnblogs.com/alunchen/p/6078633.html
Copyright © 2011-2022 走看看