博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 委托Delegate(一) 基础介绍&用法
阅读量:6570 次
发布时间:2019-06-24

本文共 2851 字,大约阅读时间需要 9 分钟。

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

 

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委托的魔性。

 

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

 

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

posted on
2016-11-18 17:50 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/alunchen/p/6078633.html

你可能感兴趣的文章
浅析rune数据类型
查看>>
普通用户开启AUTOTRACE 功能
查看>>
游侠原创:推荐一款免费的Syslog转发工具
查看>>
onAttachedToWindow和onDetachedFromWindow调用时机源码解析
查看>>
根据Servlet的Filter自定义实现字符编码过滤器
查看>>
oh-my-zsh安装与配置
查看>>
1.7 文件目录管理及相关的命令使用方法
查看>>
类成员与类的实例成员
查看>>
Spark源码编译并在YARN上运行WordCount实例
查看>>
Spring AOP + AspectJ annotation example
查看>>
Spring VS EJB 3 的若干认识误区(转)
查看>>
React.js初探(一)
查看>>
json_encode后的中文不编码成unicode
查看>>
修改纵断面图标注栏
查看>>
Flex创建带有空间信息的椭圆(Polygon)
查看>>
Centos7.1环境下搭建BugFree
查看>>
共用y轴的双图形绘制
查看>>
第31讲 | 数字货币钱包服务
查看>>
P2073 送花
查看>>
iOS端项目注释规范附统一代码块
查看>>