七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate
由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下;
- 了解委托
基于委托开发事件驱动程序变得非常简单。
使用委托可以大大简化多线程编程难度。
- 理解委托
委托也可以看做成一种数据类型,可以定义变量,但是他是一种特殊变量。
委托定义的变量能接收的数值只能是一个方法(函数),可以理解成委托就是方法的指针。
委托步骤:
【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相关推荐
- 七天学习计划_c#_[1]泛型类(还有六天,明天继续写!)
泛型类 泛型的好处:增加类型安全,带来编码的方便: 常见的泛型:泛型类和泛型方法: 后续深入:泛型委托(自定义泛型委托.常见的泛型委托Func.Action) 泛型类的规范:public cl ...
- 七天学习计划_c#_[6][7]多线程
进程:一个正在运行的程序就是一个进程.操作系统根据进程分配各种资源(内存-) 首先打开任务管理器,查看当前运行的进程: 从任务管理器里面可以看到当前所有正在运行的进程.那么究竟什么是进程呢? 进程(P ...
- C/C++学习之路_七: 内存管理
C/C++学习之路_七: 内存管理 目录 作用域 内存布局 内存分区代码分析 1. 作用域 C语言变量的作用域分为: 代码块作用域(代码块是{}之间的一段代码) 函数作用域 文件作用域 1. 局部变量 ...
- 执行计划有时不准确_高效学习计划的制定原则和分类执行方法
学习计划不仅关系到每一天的学习,详尽的学习计划甚至关系到每一节课的学习,只有制定合理的学习计划,并严格执行下去,经过长时间的坚持,才能形成良好的学习习惯,下面就是高效学习计划的制定原则和分类执行方法, ...
- 学生每日计划表_小学生每日学习计划表格怎么制定
小学生每日学习计划表格怎么制定 导读:小编根据大家的需要整理了一份关于<小学生每日学习计划表格怎么制定>的内容,具体内容:长期按学习计划办事,就会使每天的学习生活很有规律,甚至逐渐形成条件 ...
- 软件开发人员的学习计划_经常与开发人员混在一起培养创新和学习的文化
软件开发人员的学习计划 Without skilled developers, the Scrum Framework is no more than lipstick on a pig. Havin ...
- 六年级上计算机课程计划书,六年级学习计划书_小学六年级学习计划范文
想要更高效地学习,大家可以提前制定好一份学习计划.下面是小编整理的六年级学习计划书,欢迎大家参考! 1.我认为,我目前最大的毛病就是上课不认真听讲.总是在课堂上摆着一个认真听讲的架子,但脑子却早已想别 ...
- liu四声拼音怎么读_拼音是99%的西安孩子幼升小必备知识!附:幼小拼音学习计划...
在西安本地幼升小考试中,90%的小学试题都会涉及拼音知识内容.2015年高新一小幼升小入学考试第一题为"请默写拼音中的声母和韵母." 2016年高新三小幼升小试题中考察拼音的方式为 ...
- 转发:Datawhale第七期组队学习计划
编者注:Datawhale是一个公益组织,也是AiUnion的四个成员之一,所有学习计划是免费的. 第7期Datawhale组队学习计划 马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论 ...
最新文章
- Android TextView
- python开发企业管理平台_我的第一个python web开发框架(34)——后台管理系统权限设计...
- 太晚睡不着的落寞与开心(记近况)
- Left,Right,Outer和Inner Joins有什么区别?
- centos8 配置 dns_Linux搭建DHCP+DNS+WEB服务
- Selenium 自动化测试之道--Maven-TestNG
- cnc加工中心保养表_CNC加工中心有哪些日常保养方法?
- 【 jquery 】常用
- Kali Linux 从入门到精通(三)-入侵系统定制
- 用递归方法判断字符串是否是回文(Recursion Palindrome Python)
- @PostConstruct、@PreDestroy注解介绍及Spring中@PostConstruct、constructor、@Autowired的顺序
- Python+常用模块(2).md
- 算法导论 思考题6-3(Young氏矩阵)
- AcWing 2041. 干草堆(差分)
- Android中需要了解的数据结构(一)
- 0X000000该内存不能为read的解决方法(转)
- JDBC userenv('LANG')
- obs多推流地址_微信小程序直播电脑端OBS推流直播教程
- ICPC 2022西安回顾
- win7计算机c盘搜索不到,win7系统上找不到C盘上的programdata文件夹的解决方法