委托与事件以及应用

news/2024/7/8 16:27:15 标签: action, textbox, silverlight, linq, winform, webform
 

因为最近再带两个实习的朋友~ 他们在理解委托这块 不明白能用来做什么 对这块理解的不好 更不用说委托扩展来的 拉姆达表达式 事件等了~  但是这些很重要 在MVC  EF4.1 里 都会有很多拉姆达表达式的影子 在做组件开发 用户控件开发  事件的运用 一定也是少不了的   稍微深入点儿的说  用于两个对象之间的通讯 用来解耦 用委托事件 是很不错的选择 而设计模式里的观察者模式 也是基于委托事件的应用  还有做winform 开发的 里的线程 WPF SL 的异步调用等  都是有这委托的影子的  所以 这个还是很重要的。也是一定要掌握的~ 希望通过这篇文章 能让大家更加了解委托以及如何运用~

一.委托以及延伸

先看下MSDN 的介绍吧~------ delegate

通俗的说 委托就是可以实现 把方法做为变量来传递

1.先写个最简单的委托的用法

静态的和非静态方法的

结果会输出

您好 wlf

 Hello wlf

这是最原始的委托

2. 进化为匿名方法

声明完委托后  还要声明方法 是不是很麻烦  如果不声明方法  用匿名方法 可以帮我们 看 代码减少了很多吧~

3.再进化为拉姆达表达式

上面的虽然简单了不少 但是 还能更简单的  用拉姆达表达式~

看 这就是拉姆达表达式的演变 一定要会这个~  因为在EF LINQ 等 有很多用拉姆达表达式的~

4.用Action 和Func继续简化

上面的代码以及很简单了 但是还有个很不爽的一点~  要声明委托! 可以不声明么?当然可以~

先看 MSDN介绍  Action 和 Func

通俗的讲 这两个都是用来帮你声明委托 

Action 用于帮你声明没用返回值的委托    Func则是有返回值的  最后一个参数为返回值

看~ 以前的版本 总是要声明一个HelloWorld 的委托  现在只有两行代码就可以了  下面顺便掩饰了有返回值的 func 的例子。第一个参数 是传递

参数的类型 第二个是返回值的类型  ~ 这里说下 这俩函数都有16个重载~  所以多个参数是没问题的~

5.说说委托的好处

委托的好处 应用 文章开始已经说了很多了 这里就拿文章开头的例子 体会下委托的好处 

当我们再多一种语言来问好时  只需增加一种Action 即可  而不需要改动 sayHello 方法 否则 这里将充满了 if else 的判断 

  6.工作里的应用

 再 LINQ 或EF 里 都有 个很重要的  数据刷选的功能  WHERE 它的参数就是 Func  直接上代码  自己看注释~

看 可以很轻松的实现 数据过滤~  喜欢这种函数式风格的编程方式 我们可以点  顺便介绍工作中的 Action 

嗯 有图有真相~  这个ForEach 的参数 正是Action 以后遇到这几个 新手们就不用再陌生了~

 实现把集合里 大于4的打印出来的 这个功能  全部都是点儿出来的~ 

提示:尽量不要再ForEach 里进行集合的操作 比如 移除集合里的元素等~ 否则会出来不希望出现的结果~ 出来的结果为 2 4 6

原因 反编译 我们发现是 for  按索引删除

上面的话题扯远了~ 回归主题

二 .事件以及应用

1.先用委托来实现一个常见的工作场景(委托代替事件)

 webForm  用户控件 我们在实际工作中 用的都是非常多的  说一个场景  一个用户控件 里面一个textbox  一个button  一个页面引用了

这个用户控件 这个页面里有一个label 我希望 点击 用户控件里的 button改变  把 textbox 里的值 绑定到 label 上  这就是一个典型的委托事件的

应用

 1.直接上代码  先上用户控件的

声明一个委托   当点击按钮时  调用

2.  引用用户控件的页的代码

当然 我们会了拉姆达表达式  完全可以写成

这里主要说的是 委托的注册 记得要写到  !IsPostBack 外面   

大概顺序是这样的  先执行 用户控件的外部变量赋值 =>  再执行父页面的用外部变量赋值(本例子中没有)=> 再执行父页面的pageload=>用户控件的pageload 

如果不写到 !IsPostBack 外面    点击按钮后  先执行 用户控件的外部变量赋值(以前被赋值的委托会又为空,所以这时需要在页面pageload 里 重新注册 而不能写到!IsPostBack) 里面~

3 只用委托的缺点

功能虽然实现了  但是我们想  我们可以在 父页面  给  Puchange.onChangevent 赋值为null 或者篡改为别的  而我希望我们在引用时 只能添加 或移除 这样就更

完美了 所以 事件就出来了~

2.使用事件重新实现上面的代码

1.用户控件里的

2.父页面

3.winform 或Silverlight 里尽量使用委托和事件 来通讯

这样可以更好的降低耦合  避免了 子窗体中出现父窗体对象  降低耦合 

三.委托的其他资料

委托的逆变与协变

何时使用委托何时使用接口

正则表达式委托

异步委托编程

基于事件的异步模式概述

四.总结

文章比较入门 希望新手能对委托事件有更好的了解 平且能把委托扩展来的东西 熟练运用到工作中 来简化代码~ 并且能把事件熟练运用~文章的目的也达到了。


http://www.niftyadmin.cn/n/963418.html

相关文章

LabVIEW开发发电厂合规性测试系统

LabVIEW开发发电厂合规性测试系统 电厂控制器框架完全基于LabVIEW平台。能够开发不同的通信协议,必要的控制回路,以及它们与第三方的集成。此外,利用cRIO平台的可靠性,能够处理与电力公司的相互通信,提供了冗余网关&a…

服务器创建文件系统,使用linux的mkntfs命令创建 NTFS 文件系统

使用linux的mkntfs命令创建 NTFS 文件系统发布时间:2020-07-22 10:47:39来源:亿速云阅读:63作者:清晨栏目:服务器这篇文章主要介绍使用linux的mkntfs命令创建 NTFS 文件系统,文中介绍的非常详细&#xff0c…

LabVIEW在同一表中同时显示十六进制字符和普通字符

LabVIEW在同一表中同时显示十六进制字符和普通字符 如何在同一个表中同时显示十六进制字符串和普通字符串。如果有来自十六进制显示字符串控件和普通显示字符串控件的输入,并且需要在表中显示它们,可以参考下面的例子。在此示例中,可以更改连…

重温Petshop 谈谈对三层架构的理解--兼发布一个通用的数据访问控件(oracle免装客户端)

编写这个组件的需求灵感来自于看了某个产品(企业应用系统)研发项目的源码,该产品为了同时支持sql server 和oracle, 照搬了微软的 petshop的代码作为系统架构,petshop相信很多.net程序员都非常熟悉了,里面…

服务器电源线的型号,服务器电源线接口类型

服务器电源线接口类型 内容精选换一换查询Job的执行状态。对于创建裸金属服务器、挂卸卷等异步API,命令下发后,会返回“job_id”,通过“job_id”可以查询任务的执行状态。GET /v1/{project_id}/jobs/{job_id}参数说明请参见表1。请求参数无无…

LabVIEW查找n个元素数组中的质数

LabVIEW查找n个元素数组中的质数 需要查找n个元素中所有的质数时,可以参照如下的方法。 ​ 编辑 添加图片注释,不超过 140 字(可选) ​ LabVIEW、LabVIEW开发、LabVIEW编程、LabVIEW程序 上文中提到的例子和资料&#xff0c…

各类服务器MySQL性能,MySQL之服务器性能剖析

关于mysql服务器性能,可能需要关注的点会比较多,如:如何确认服务器是否达到了性能最佳的状态,找出某条语句为什么执行不够快,以及诊断被用户描述成“停顿“,“堆积“或者“卡死“的某些间歇性疑难故障。这看起来很不简…

Jpgraph使用demo

<?phprequire_once(jpgraph-4.0.2/src/jpgraph.php);$acc;if($aca){ /********************条形图************************/ require_once(jpgraph-4.0.2/src/jpgraph_bar.php);//条形图的类 //创建图表数据 $xdata array(Mousemats, Pens, T-Shirts, Mugs); $ydata arr…