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

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

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

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

C# 委托Delegate(一) 基础介绍&用法的更多相关文章

  1. [.NET] C# 知识回顾 - 委托 delegate (续)

    C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...

  2. 关于C# 委托(delegate)与事件(event)的用法及事例

    C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用.有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床. ...

  3. C# 委托delegate的基本用法

    委托:就是一个方法的类型,下面3个调用情况来详细熟悉一下: 1.调用组合委托 //委托:就是一个方法的类型 public delegate int TestDelegateStr(); public ...

  4. C# 代理/委托 Delegate

    本文转载自努力,努力,努力 1. 委托的定义:委托是函数的封装,它代表一"类"函数.他们都符合一定的签名:拥有相同的参数列表,返回值类型.同时,委托也可以看成是对函数的抽象,是函数 ...

  5. 深入理解委托(Delegate)

    前言 委托其实一直以来都感觉自己应该挺熟悉的,直到最近又去翻了翻 CLR via C#,感觉我之前的理解可能还有失偏颇.在这记录一下. 之前文章的链接: 接口和委托的泛型可变性 C#高级编程笔记 De ...

  6. C# Note2:委托(delegate) & Lambda表达式 & 事件(event)

    前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...

  7. IOS开发使用委托delegate在不同窗口之间传递数据

    IOS开发使用委托delegate在不同窗口之间传递数据是本文要介绍的内容,主要是来讲解如何使用委托delegate在不同窗口之间传递数据,具体内容来看详细内容.在IOS开发里两个UIView窗口之间 ...

  8. [C#] C# 知识回顾 - 委托 delegate

    C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...

  9. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

随机推荐

  1. C# DateTime与时间戳转换

    C# DateTime与时间戳的相互转换,包括JavaScript时间戳和Unix的时间戳. 1. 什么是时间戳 首先要清楚JavaScript与Unix的时间戳的区别: JavaScript时间戳: ...

  2. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  3. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  4. Python标准库--typing

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 模块简介 Python 3.5 增加了一个有意思的库--typ ...

  5. CSS 3学习——transform 2D转换

    首先声明一点,transform属性不为none的元素是它的定位子元素(绝对定位和固定定位)的包含块,而且对内创建一个新的层叠上下文. 注意:可以通过 transform-box 属性指定元素的那个盒 ...

  6. 《LoadRunner12七天速成宝典》签售会2016-12-17北京

    报名地址: http://www.after615.com/actives/s?id=3141&time=1480042829608&sign=9ac8e25e9ab3cf57f613 ...

  7. VSCode添加Sciter脚本Tiscript高亮支持

    Sciter中的Tiscript脚本不是标准的Javascript,是对Javascript的扩展.所以在常用的编辑器和IDE上对于高亮的支持很不好. 不过在Sciter论坛中找到了在VSCode上的 ...

  8. web 前端(轮番插件)

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  9. 去IOE的一点反对意见以及其他

    某天在机场听见两老板在聊天,说到他们目前销售的报表老跟不上的问题,说要请一个人,专门合并和分析一些发过来的excel表格,我真想冲上去说,老板,你需要的是一个信息处理的系统,你需要咨询么.回来一直耿耿 ...

  10. IIS8 使用FastCGI配置PHP环境支持 过程详解

    平时帮朋友们配置过一些PHP环境的服务器,但是一直使用的都是Apache HTTP+PHP,今天呢,我吧IIS+PHP配置方式给大家发一下下~呵呵. 在这里,我使用的是FastCGI模块映射的方式配置 ...