初入社会,对于我这个初级程序员来说要学的东西实在太多了,公司最近在做一个winform框架开发的桌面应用程序,众所周知,winform也好,webform也好,里面随处可见的事件驱动,有事件,当然也少不了委托,感觉之前对委托这个概念的理解一直是模模糊糊的,口里都会背的那么几句话:“委托可以把方法当作参数在另一个方法中传递和调用”,“委托是方法的快捷方式”等等。但是真要深入理解,灵活运用,还是要有良好的代码理解功底和面向对象基础的,今天就再来把委托这个知识梳理梳理,以加深对它的理解。

要理解委托,我们首先要知道委托的概念:

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

这是百度上和许多教科书上都有的一个概念,但是初学这门编程语言的话,或者基础比较差的童鞋,看到这句话,肯定是一脸懵比,先不用着急,我们来慢慢通过代码去理解委托这个概念

(1)首先新建一个控制台程序,对于初学者而言,控制台程序是学习基础知识的最好工具

//delegate void EvenHandler(object sender, EventArgs e);
public delegate void MyDel();//自定义一个委托
class Program
{
static void Main(string[] args)
{
//(1)简单委托
MyDel say1 = SayHi;
MyDel say2 = new MyDel(SayHi);
say1();
say2();
}
static void SayHi()
{
Console.WriteLine("Hi World");
}
}

这是最简单的委托实例了,委托可以通过上面say1和say2两种方式进行调用,这里我们要知道委托也是一种类型,所以它和类是同级的,可以通过委托来掉用方法,不要误以为委托和方法同级的,方法只是类的成员,还有定义委托和与之对应的方法必须具有相同的方法签名,即参数个数,类型相同,返回值类型相同,上面代码实例没有什么实际意义,只是然我们知道委托的结构以及委托与方法的关系

(2)委托的扩展

//自定义一个委托
public delegate int Expression(int a, int b);
class Program
{
static void Main(string[] args)
{
//(2)委托扩展
//Expression ex = GetEX;
//Calculate(ex, 25, 10);
Calculate(GetAdd, , );
}
static int Add(int a, int b)
{
return a + b;
}
static int Divide(int a, int b)
{
return a / b;
}
static int subtract(int a, int b)
{
return a - b;
}
static int multiply(int a, int b)
{
return a * b;
}
static int GetAdd(int a, int b)
{
return a + b;
}
static void Calculate(Expression ex, int a, int b)
{
Console.WriteLine(ex(a, b) + "\n");
}
}

和之前比,稍微把代码复杂了那么一点点,上面我们真正实现了“把方法当作参数在另一个方法中传递或调用”,实现了一个简单的加法方法,当然我们也写了减法,乘法,除法的方法。你会想这样写有什么好处呢?我直接调用自己的加减乘除方法不就完了吗,何必要多此一举,通过委托来折腾一番呢?委托的意义何在呢?在这里请先听我先说一种思想:“上面的Calculate方法里面代码比较少,只有一个简单的输出语句,而且我们只想单纯的实现一个简单加减乘除效果,所以你会感觉有点多次一举,也可以说本来就是多次一举,但是你可以设想一下,假如我们这几个加减乘除方法,它的代码量非常庞大,但是这几个方法的代码相似度又非常高,但是每个方法里就只有一两个小小的语句块儿不一样,那不是会让你觉得很不爽,很想把它们整合,那怎么处理呢?你可能首先会想通过if,else if或者switch语句对不同部分的代码块做不同的处理,现在我只需要做加减乘除四个case,这个思路暂且可以接受,那将来我又要加余数运算,平方运算,指数对数运算等等,假设我几百个甚至更多个这样类似的方法呢,那我岂不是要写几百个if,else,这样做很明显程序的扩展性会很差。所以我们要换个思路,我们完全可以通过一个方法把相同的部分封装起来,而不同的部分通过参数传过去,但是方法并不能直接被当作参数被传递和调用,那怎么办呢?,那么这时候委托的作用就体现出来了,我们可以把委托作为参数传递给封装好了的方法,通过委托来动态的调用方法。”  结合我所说的思想,那么上面封装的部分就类似与我们的Calculate方法,而不同的部分就是每个加减乘除方法,你可以假设Calculate是一个非常庞大的已经封装好了的方法,而我们传进去的只是这个方法需要动态改变的部分,这样就是最上面概念所谓的“方法动态地赋给参数”,这样写到好处是大大提升了方法的灵活性与扩展性,也减少了代码的冗余,所以委托在实际项目中是一个十分有用的工具,它可以使你的代码更加的”舒适,健壮“。是不是感觉对委托的理解有那么一丢丢长进了,之后我还会继续写关于学习匿名方法,lambda表达式,泛型委托,以及事件的相关学习心得。以上言论是我自己参考资料,和项目实战后自己做出的总结,如果又什么不对的地方,希望各位大神指出^^。

委托学习总结(一)浅谈对C#委托理解的更多相关文章

  1. Spring5.0源码学习系列之浅谈BeanFactory创建

    Spring5.0源码学习系列之浅谈BeanFactory创建过程 系列文章目录 提示:Spring源码学习专栏链接 @ 目录 系列文章目录 博客前言介绍 一.获取BeanFactory主流程 二.r ...

  2. 浅谈 Attention 机制的理解

    什么是注意力机制? 注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制.例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目 ...

  3. 浅谈-对modbus的理解

    浅谈-对modbus的理解 一.简介 Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准.1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP ...

  4. Spring5.0源码学习系列之浅谈循环依赖问题

    前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文浅谈Spring循环依赖问题,这是一个面试比较常见的问题 1.什么是循环依赖? 所谓的循环依 ...

  5. 【SSH学习笔记】浅谈SSH框架

    说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...

  6. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  7. Android开发学习笔记:浅谈GridView

    GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的.主要用于设置Adapter. GridView常用的X ...

  8. 【知了堂学习心得】浅谈c3p0连接池和dbutils工具类的使用

    1. C3P0概述 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. 2. C3P ...

  9. 浅谈JavaScript--事件委托与事件监听

    事件监听 该方法用于向指定元素添加事件句柄(代码块),且不会覆盖已存在的事件句柄. 即可以向同一个元素添加同一个事件多次. 添加事件 语法: element.addEventListener(even ...

随机推荐

  1. Python - Python2与Python3的区别、转换与兼容

    区别 Python2.x与Python3.x版本区别:http://www.runoob.com/python/python-2x-3x.html 示例解读Python2和Python3之间的主要差异 ...

  2. Shell脚本中的for case while循环流程控制语句的使用

    shell作为一种脚本编程语言,同样包含循环.分支等其他程序控制结构,从而轻松完成更加复杂.强大的功能. 编写脚本的思路 1  明确脚本的功能 2  编写脚本时会使用到那些命令 ?   3  把变化的 ...

  3. web开发中获取的各种高度和宽度

    前端开发中经常需要获取页面还有屏幕的高度和宽度进行计算,此文即介绍如何用 JavaScript 还有 jQuery 获取这些尺寸. 1.简介 一个页面显示在浏览器内,浏览器又放置在屏幕窗口内,所以由里 ...

  4. [原创]利用Browser协议探测内网主机操作系统版本(无需端口无视防火墙)

    利用Browser协议可获取机器IP.MAC.机器名.操作系统.域,如图 浏览 在SMB协议中,计算机为了访问网络资源,就需要了解网络上存在的资源列表(例如在Windows下使用网络邻居查看可以访问的 ...

  5. IDEA激活码(2019)

    如您激活出现问题,请点击这里加入:软件激活问题解决群 前言 IDEA已然成为我最热爱的一款编辑器,作为一个从Eclipse阵营转过来的coder,确实能感受到IDEA的强大,而我电脑桌面的Eclips ...

  6. influxdb使用说明

    前言 influxdb是目前比较流行的时间序列数据库. 何谓时间序列数据库?什么是时间序列数据库,最简单的定义就是数据格式里包含Timestamp字段的数据,比如某一时间环境的温度,CPU的使用率等. ...

  7. windows部署MongoDB

    打开MongoDb下载页面,分别下载Community Server和Compass,注意在安装Community Server时可以勾选同时安装Compass,但会比较慢,所以建议两个分开下载安装. ...

  8. JS 中 原生方法 (二) --- 数组 (修---添加ES6新增)

    const arr = [1, 2, 3, 5, 'a', 'b'] /** * * length * 这个只能被 称之为 数组的原生属性, 返回 一个 number * arr.length */ ...

  9. Ajax上传图片以及上传之前先预览

    手头上有几个小项目用到了easyUI,一开始决定使用easyUI就注定了项目整体上前后端分离,基本上所有的请求都采用Ajax来完成.在文件上传的时候用到了Ajax上传文件,以及图片在上传之前的预览效果 ...

  10. 决策树 Decision Tree

    决策树是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布.树的最顶层是根结点.  决策树的构建 想要构建一个决策树,那么咱们 ...