由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下;

  • 了解委托

基于委托开发事件驱动程序变得非常简单。

使用委托可以大大简化多线程编程难度。

  • 理解委托

委托也可以看做成一种数据类型,可以定义变量,但是他是一种特殊变量。

委托定义的变量能接收的数值只能是一个方法(函数),可以理解成委托就是方法的指针。

委托步骤:

【1】声明委托(定义一个方法的原型:返回值+参数类型+个数);

【2】根据委托定义一个“具体方法”实现 某 功能;

【3】创建委托对象,关联具体方法;

【4】通过委托去调用方法;

-------------------------------------------------------------------------------------------------------------------

  • 事件(event)

事件是对象在外界“刺激”下发生事情,而对外提供的一种消息机制。

事件的两个参与者:

①发送者(sender),即对象本身,当对象的本身状态发生变化时,触发事件,并通知时间的接受者;

②接受者(receiver),用来处理事件的(事件的关注着),在事件的发送者触发一个事件后,会自动执行的内容;

主窗体://【1】声明委托public delegate void delegateSendMsg(string msg);public partial class FrmMain : Form{//【2】定义一个事件public event delegateSendMsg SendMsgEvent;public FrmMain(){InitializeComponent();FrmClient01 frmClient01 = new FrmClient01();FrmClient02 frmClient02 = new FrmClient02();//【5】关联事件SendMsgEvent += new delegateSendMsg(frmClient01.EventResponse);SendMsgEvent += new delegateSendMsg(frmClient02.EventResponse);frmClient01.Show();frmClient02.Show();}//发送消息private void btnSender_Click(object sender, EventArgs e){//【3】激发事件SendMsgEvent(this.txtMsg.Text.Trim());}}从窗体02:(窗体01与02相同)public partial class FrmClient02 : Form{public FrmClient02(){InitializeComponent();}//【4】定义事件响应方法public void EventResponse(string msg){this.textBox1.Text = msg;}}

------------------------------------------------------------------------------------------------------------------

  • 委托和事件的相同点和不同点:

相同点:事件对象本身就是一个私有的委托对象,以及公有的两个方法,add和remove;

不同点:①+=方式,实际上是调用add方法对委托对象进行添加;

②委托对象私有以后,无法直接从外部赋值;例如:事件=null会出现编译错误,而委托允许这样做。优点:避免用户直接将对象用户清除。Click=null;这是不允许的。这能通过-=的方式断开事件。这样做能够起到保护作用。而委托太过于“开放”了。

-------------------------------------------------------------------------------------------------------------------

  • 泛型委托

当我们的发现如果我们的一些方法需要委托但是这些方法相似,仅仅是是返回值和参数类型不同时,就可以定义一个泛型委托;

//泛型委托:匿名方法、Lambda表达式class _GenericDelegateDemo{static void Main(string[] args){//【1】使用委托MyGenericDeleage<int> objDelegate1 = Add;MyGenericDeleage<double> objDelegate2 = Sub;Console.WriteLine(objDelegate1(10, 20));Console.WriteLine(objDelegate2(10.8, 20.4));//【2】使用匿名方法MyGenericDeleage<int> objDelegate3 = delegate (int a, int b) { return a + b; };MyGenericDeleage<double> objDelegate4 = delegate (double a, double b) { return a - b; };Console.WriteLine(objDelegate3(10, 20));Console.WriteLine(objDelegate4(10.8, 20.4));//【3】使用Lambda表达式MyGenericDeleage<int> objDelegate5 = (a, b) => a + b;MyGenericDeleage<double> objDelegate6 = (a, b) => a - b;Console.WriteLine(objDelegate5(10, 20));Console.WriteLine(objDelegate6(10.8, 20.4));Console.ReadLine();}static int Add(int a ,int b){return a + b;}static double Sub(double a, double b){return a - b;}}//定义泛型委托public delegate T MyGenericDeleage<T>(T obj1, T obj2);

-------------------------------------------------------------------------------------------------------------------

  • Func委托(17个重载)

Func委托必须要求所接受的方法有一个返回值,Action委托接收一个没有返回值的方法

为了方便开发者使用,.NET基类库针对在实践中最常用的情况,提供了几个预定义好了的委托,这些委托使用非常广泛,尤其是在编写Lambda表达式和开发并行计算的时候经常遇到

注意:①Func委托声明的最后一个泛型类参数是委托所接收方法的《返回值类型》

②如果前面有反省类型的参数,这个参数就是委托方法的形参类型

static void Main(string[] args)
{Func<int, int, double> func = Add;double result = func(10, 20);Console.WriteLine(result);Console.ReadLine();
}
static double Add(int a ,int b)
{return a + b;
}  

那用这个func委托的好处在哪呢???下面就做个对比

例:给一个数组,从数组中指定位置的几个数求和求积

普通的方法如下:

我们可以观察得知,上面的两个方法只有运算符不同;如果还要求写其他的算法,如减法除法,那每个方法都要写一遍。那么我们将运算符作为一个方法的参数传进来,过程让他都一样,那程序就简化了许多;

Console.WriteLine(CommocMethod(Add,nums,0,3));

Console.WriteLine(CommocMethod(Multiply,nums,0,3));

总结:Func委托系列引用一个《有返回值的方法》,也就是将方法作为另一个方法的“参数”

-----------------------------------------------------------------------------------------------------------------------

  • Action委托

​​​​​​​应用:在跨线程访问可视化控件的时候经常使用

Action<string> act = (a)=>Console.Write(a);
act("内容文本");

-----------------------------------------------------------------------------------------------------------------------

  • predicate委托

七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate相关推荐

  1. 七天学习计划_c#_[1]泛型类(还有六天,明天继续写!)

    泛型类     泛型的好处:增加类型安全,带来编码的方便: 常见的泛型:泛型类和泛型方法: 后续深入:泛型委托(自定义泛型委托.常见的泛型委托Func.Action) 泛型类的规范:public cl ...

  2. 七天学习计划_c#_[6][7]多线程

    进程:一个正在运行的程序就是一个进程.操作系统根据进程分配各种资源(内存-) 首先打开任务管理器,查看当前运行的进程: 从任务管理器里面可以看到当前所有正在运行的进程.那么究竟什么是进程呢? 进程(P ...

  3. C/C++学习之路_七: 内存管理

    C/C++学习之路_七: 内存管理 目录 作用域 内存布局 内存分区代码分析 1. 作用域 C语言变量的作用域分为: 代码块作用域(代码块是{}之间的一段代码) 函数作用域 文件作用域 1. 局部变量 ...

  4. 执行计划有时不准确_高效学习计划的制定原则和分类执行方法

    学习计划不仅关系到每一天的学习,详尽的学习计划甚至关系到每一节课的学习,只有制定合理的学习计划,并严格执行下去,经过长时间的坚持,才能形成良好的学习习惯,下面就是高效学习计划的制定原则和分类执行方法, ...

  5. 学生每日计划表_小学生每日学习计划表格怎么制定

    小学生每日学习计划表格怎么制定 导读:小编根据大家的需要整理了一份关于<小学生每日学习计划表格怎么制定>的内容,具体内容:长期按学习计划办事,就会使每天的学习生活很有规律,甚至逐渐形成条件 ...

  6. 软件开发人员的学习计划_经常与开发人员混在一起培养创新和学习的文化

    软件开发人员的学习计划 Without skilled developers, the Scrum Framework is no more than lipstick on a pig. Havin ...

  7. 六年级上计算机课程计划书,六年级学习计划书_小学六年级学习计划范文

    想要更高效地学习,大家可以提前制定好一份学习计划.下面是小编整理的六年级学习计划书,欢迎大家参考! 1.我认为,我目前最大的毛病就是上课不认真听讲.总是在课堂上摆着一个认真听讲的架子,但脑子却早已想别 ...

  8. liu四声拼音怎么读_拼音是99%的西安孩子幼升小必备知识!附:幼小拼音学习计划...

    在西安本地幼升小考试中,90%的小学试题都会涉及拼音知识内容.2015年高新一小幼升小入学考试第一题为"请默写拼音中的声母和韵母." 2016年高新三小幼升小试题中考察拼音的方式为 ...

  9. 转发:Datawhale第七期组队学习计划

    编者注:Datawhale是一个公益组织,也是AiUnion的四个成员之一,所有学习计划是免费的. 第7期Datawhale组队学习计划 马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论 ...

最新文章

  1. Android TextView
  2. python开发企业管理平台_我的第一个python web开发框架(34)——后台管理系统权限设计...
  3. 太晚睡不着的落寞与开心(记近况)
  4. Left,Right,Outer和Inner Joins有什么区别?
  5. centos8 配置 dns_Linux搭建DHCP+DNS+WEB服务
  6. Selenium 自动化测试之道--Maven-TestNG
  7. cnc加工中心保养表_CNC加工中心有哪些日常保养方法?
  8. 【 jquery 】常用
  9. Kali Linux 从入门到精通(三)-入侵系统定制
  10. 用递归方法判断字符串是否是回文(Recursion Palindrome Python)
  11. @PostConstruct、@PreDestroy注解介绍及Spring中@PostConstruct、constructor、@Autowired的顺序
  12. Python+常用模块(2).md
  13. 算法导论 思考题6-3(Young氏矩阵)
  14. AcWing 2041. 干草堆(差分)
  15. Android中需要了解的数据结构(一)
  16. 0X000000该内存不能为read的解决方法(转)
  17. JDBC userenv('LANG')
  18. obs多推流地址_微信小程序直播电脑端OBS推流直播教程
  19. ICPC 2022西安回顾
  20. win7计算机c盘搜索不到,win7系统上找不到C盘上的programdata文件夹的解决方法

热门文章

  1. modelsim-win64-10.1c的安装和基本使用
  2. python用哪个版本比较好 2020_2020年最常见的Python面试题答案
  3. USB入门系列之一:USB概述
  4. 编译可在Android上运行的qemu user mode
  5. AVFoundation学习Demo--拍摄视频
  6. log4j 超完美配置文件!
  7. 利用ServletFileUpload组件上传文件
  8. 返回代表指定日期的指定日期部分的整数。返回当前周
  9. MATLAB遍历子文件夹及其下文件
  10. PowerToys,微软开源的超实用小工具合集