C#委托与事件以及应用

C#委托与事件以及应用
C#委托与事件以及应用

这些很重要在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 里尽量使用委托和事件来通讯这样可以更好的降低耦合避免了子窗体中出现父窗体对象降低耦合

相关主题
相关文档
最新文档