C# 关于委托的一点心得

使用委托

按照函数类型定义委托

委托的作用:1、动态调用函数

2、函数回调和事件机制的基础

对于有C++经验的人来说,可以把委托理解为函数指针;对于没有C++经验的人来说,委托可以理解为一种特殊的数据类型---函数的类型。

对于C#来说,和普通的数据类型一样,函数也有类型,只不过函数的类型是通过函数的返回值类型以及参数列表决定的,如果两个函数的返回类型,以及参数的顺序和类型,参数的数量完全相同,那么就可以说这两个函数类型相同。

那么,就可以用委托来表示某种特定类型的函数,并且可以表示多个函数,使用委托就好像调用这些函数,由于它可以串联多个函数,所以就会按照串联的顺序依次调用这些函数,如果有返回值,那么将返回最后一个函数的返回值。

委托既然可以理解为一种特定的类型,那么,它实质上是一个类,编译器会根据关键字“delegate”自动从System.Delegate类派生一个类,那么,委托也可以有它的访问修饰符,如private、public等,同业也有它自己的成员。

C#中用关键字“delegate”来定义委托(定义一种数据类型)

Delegate returntype DelegateName(Type1 para1,Type2 para2,…);

用委托动态调用函数

既然委托可以理解为一种特定的数据类型,那么使用委托跟使用其他数据类型一样,一般分为三个步骤:1、声明委托变量,跟声明普通类型的变量一样。2、为委托变量赋值,委托变量可以看成是一个函数链表,可以通过”=“为函数链表指定唯一函数,也可以通过”+=“为函数链表指定多个函数,还一个通过”-=“从函数链表中删除指定函数。3使用委托变量,像使用函数那样直接使用委托变量,例如定义了一个委托变量voidFunc,那么使用它的时候,直接”voidFunction()“,也可以通过调用委托变量的成员函数”invoke()“来使用委托变量,例如”voidFunc.Invoke()“。

用委托传递函数参数

在使用委托变量的时候指定参数而已。

例子

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace DelegateApp

{

class Program

{

delegate void DSimpleVoidFunc();

delegate float DFloatFunc(int val1,float val2);

static void Main(string[] args)

{

DSimpleVoidFunc voidfun;   //声明委托变量

voidfun = PrintHaHa;       //为委托变量赋值

voidfun();                 //使用委托变量

voidfun += PrintHeHe;

voidfun();

voidfun -= PrintHeHe;

voidfun.Invoke();

UseParaDelegate();

Console.ReadLine();

}

static void PrintHaHa()

{

Console.WriteLine("HaHa...");

}

static void PrintHeHe()

{

Console.WriteLine("HeHe...");

}

static void UseParaDelegate()

{

DFloatFunc floatfunc;

float result;

floatfunc = Add;

result = floatfunc(5, 2.0f);

Console.WriteLine("1. Result={0}",result);

floatfunc += Sub;

result = floatfunc(5, 2.0f);

Console.WriteLine("2. Result={0}", result);

floatfunc += Mul;

result = floatfunc(5, 2.0f);

Console.WriteLine("3. Result={0}", result);

floatfunc -= Mul;

floatfunc += Add;

result = floatfunc.Invoke(5,2.0f);

Console.WriteLine("4. Result={0}", result);

}

static float Add(int val1,float val2)

{

Console.WriteLine("{0}+{1}={2}", val1, val2, val1 + val2);

return val1 + val2;

}

static float Sub(int val1,float val2)

{

Console.WriteLine("{0}-{1}={2}", val1, val2, val1 - val2);

return val1 - val2;

}

static float Mul(int val1,float val2)

{

Console.WriteLine("{0}*{1}={2}", val1, val2, val1 * val2);

return val1 * val2;

}

}

}

时间: 2024-12-14 01:58:55

C# 关于委托的一点心得的相关文章

FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中

<span style="font-size:18px;">//首先,获取数据库的路径,(如果不存在,就是我们想要存储的路径),不用担心每次都创建数据库会重复,不会的,如果没有则创建,有了就不会再重复创建: //接下来,我们要制表,首先我们先查看我们的表是否已经存在,方法在下面代码中:如果存在则跳过,不存在则创建</span> -(void)DataBaseInit { //获取Document文件夹下的数据库文件,没有则创建 NSString *dbPath

开发微信支付的一点心得

由于使用了别人封装的微信公众平台SDK http://www.cnblogs.com/x3d/p/3740454.html  ,所以省去了完整理解开发手册的时间. 微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布.必须到你通过程序测试提交订单.发货通知等数据到微信的系统中,才能申请发布. 然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到二级三级目录下去,这对于使用MVC框架来说,是个小问题. 使用MVC,在开发环境,url往往是native url格

关于div布局的一点心得

如果是嵌套的div布局,外面的div 比如是<div  class="container"></div>这时候设置的是一个大的外框架,居中显示.我们要在里面嵌套div来 显示内容,这时候就通过<div style="display:block;position:relative"></div>来使得div标签的位置是相对于外面最靠近它的父级标签也就是<div  class="container"

网页开发规则的一点心得

1.script文件放在body标签最后,script默认是 type="text/javascript",所以可以省略 2.css文件也要提取出来单独放在一个.css文件中用<link rel="stylesheet"  href="file address"  media="screen">引入文件中 3.建立scripts文件夹,用于放置脚本文件 4.建立css文件夹用于放置css文件 5.建立image文件

关于现场技术支持的一点心得

技术支持本质上是一种专业服务,礼貌的沟通交流是成功的第一步,解决用户问题的同时并让用户保持愉快的心情是终极的目标; 一点心得体会如下: 1.到现场后先观察询问用户是否方便,这一礼貌的举动边唱好的开场戏,尤其是针对不同部门的技术相关领导哈! 2.弄清楚问题的具体现象; 3.根据经验和日志信息进行初步分析判断,缩小问题范围; 4.分析客户系统的环境,ISO版本.日期.软件rpm包版本.相关配置文件是否更改过; 5.与客户交流,分析做过什么操作; 6.over

移动web动画设计的一点心得——css3实现跑步

[原]移动web动画设计的一点心得——css3实现跑步 今年3月份,由于公司业务需要,我转岗到微信产品部,离开了TID团队,人都是有感情的动物,更何况在一个团队呆了快 3 年,心中十分舍不得,鬼哥说了“天下没有不散的宴席...”,在我的世界里又多了一次离别的伤感(虽然还在隔壁工作).加入了微信产品中心后,开始新的团队生活,工作比以前忙多了,有时周六也要上班,需要更快更高效的完成任务,除了重构页面,需要主动参与边缘外的工作,承担更多.最近比较忙,给自己敲个响钟:注意身体. 说完题外话,开始近期的主

理解机器学习算法的一点心得

从Andrew ng的公开课开始,机器学习的算法我接触到的也越来越多,我觉得机器学习算法和传统算法的最大不同就是:不会要求一个问题被100%求解,也就意味着不会有完美的解法,这也是著名的"Essentially, all models are wrong, but some are useful."所表达的意思.正因为如此,机器学习算法往往不会有一个固定的算法流程,取而代之的把问题转化为最优化的问题,无论是ML(maximum likelihood),MAP(Maximum a Pos

关于INDEX SERVER+ASP建立查询引擎的一点心得

说起INDEX SERVER,我自己本来用的也不多,不过前两天公司要做一个INDEX的搜索,我从网上找了好多的资料,仔细分析了以后自己启动了索引服务,并进行了ASP程序的设计,第一天程序运行正常,结果第二天早上,我上班的时间发现查询INDEX SERVER的ASP程序不能用了,提示是Server.CreateRecordSet("NonSequential")错误,随后IIS不能解析ASP文件,我自己进行了一天的反复尝试,包括我停止了索引服务,删除编录,重新安装IIS也不能恢复,最后我

关于敏捷和自动化测试的一点心得

中华传统文化源于<易>,成于孝,孝为德之本.孝顺:孝则顺,不孝则不顺. 不久前,参加Thoughtworks组织的一场自动化测试的分享,同事由于出差国外不能参加,特意嘱托我提问两个问题: 在互联网这个将"敏捷"与"持续集成"进行积极实践的环境里,"敏捷测试"与"自动化测试"成了一个大家经常探讨的话题, 那么自动化测试最佳的实行时间是在什么时候?如何推行最有效的自动化测试? 以下谨代表个人观点: 个人整理了一些测试最