MyException - 我的异常网
当前位置:我的异常网» C# » C#基础增强篇—委托、Lambda表达式和事件(下)

C#基础增强篇—委托、Lambda表达式和事件(下)

www.MyException.Cn  网友分享于:2015-03-21  浏览:0次
C#基础加强篇—委托、Lambda表达式和事件(下)

3.事件

      事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起。事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方,捕获事件并对其做出响应的对象叫做事件接收方。

      C#事件是按“发布——预定”的方式工作。先在一个类中公布事件,然后就可以在任意数量的类中对事件预定。在事件通信中,事件发送方类并不知道哪个对象或方法将接收到(处理)它所引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制),这一媒介就是委托。

 

      事件功能是由3个互相联系的元素提供:提供事件数据的类、事件委托和引发事件的类。如果想要类引发名为EventName的事件,需要以下元素:

        (1)持有事件数据的类:名为EventNameEventArgs。该类必须继承System.EventArgs类。如果不自定义持有事件数据的类,就使用System.EventArgs类。

        (2)事件的委托:名为EventNameEventHandler

        (3)引发该事件的类。该类必须提供:

                  a.事件声明:public event EventNameEventHandler  EventName;

                  b.引发事件的方法:名为OnEventName

       (4)定义使用此事件的类。所有这些类都应该包括:

                 创建事件源对象。使用定义的构造函数创建包含事件定义的类的对象。

                 定义事件处理程序,也就是定义与事件关联的方法。

                 将事件源对象注册到事件处理处理程序。使用委托对象和“+=”运算符和“-=”运算符将一个或多个方法与事件源中的事件关联。

 

      C#事件机制基于委托实现,首先要定义一个委托:

               public delegate void EventHandler(object from,myEventArgs e); //from表示发生事件的对象

      声明事件的格式:event 事件的委托名 事件名

               public event EventHandler TextOut;

      事件的激活一般写成:

              if(TextOut!=null)

                     TextOut(this,new EventArgs());

       订阅事件  +=  evsrc.TextOut+=new EventSource.EventHandler(CatchEvent);

        取消订阅  -=  evsrc.TextOut-=new EventSource.EventHandler(CatchEvent);

       

       下面再来看一个示例:

       

 1   public class MyEventArgs:EventArgs
 2     { //定义事件包含数据
 3        
 4         private string StrText;
 5         public MyEventArgs(string StrText)
 6         {
 7             this.StrText = StrText;
 8         }
 9         public string GetStrText
10         {
11             get
12             {
13                 return StrText;
14             }
15         }
16     }
17 
18     public class EventSource
19     {//发布事件的类
20        
21         MyEventArgs EvArgs = new MyEventArgs("触发事件");
22         public delegate void EventHandler(object from, MyEventArgs e);//定义委托
23         public event EventHandler TextOut;//定义事件
24         public void TriggerEvent()//激活事件的方法
25         {
26             if(TextOut!=null)
27             {
28                 TextOut(this, EvArgs);
29             }
30         }
31     }  
32     class Test
33     {//订阅事件的类
34         static void Main(string[] args)
35         {
36             EventSource evsrc = new EventSource();
37             evsrc.TextOut += new EventSource.EventHandler(CatchEvent);//订阅事件
38             evsrc.TriggerEvent();//触发事件
39             Console.WriteLine("--------------");
40 
41             evsrc.TextOut -= new EventSource.EventHandler(CatchEvent);//取消订阅事件
42             evsrc.TriggerEvent();//由于订阅已取消,什么也不执行
43             Console.WriteLine("--------------");
44 
45             Test theApp=new Test();
46             evsrc.TextOut += new EventSource.EventHandler(theApp.InstanceCatch);
47             evsrc.TriggerEvent();
48         }
49         private static void CatchEvent(object from, MyEventArgs e)
50         {//事件处理程序
51             Console.WriteLine("CatchEvent:{0}", e.GetStrText);
52         }   
53         private void InstanceCatch(object from, MyEventArgs e)
54         {//事件处理程序
55             Console.WriteLine("InstanceCatch:{0}", e.GetStrText);
56         }
57     }

  

    可以对照着上面的介绍,来找一下事件的几个相关元素。

 

委托、Lamada表达式、事件的一些基础知识完。。。。

 这是我第一次写博客,本人也还是在大学里摸索的渣渣,几乎都是书上的一些内容,感觉自己一个字一个字打出来印象会比较深刻,理解也更到位,大神勿喷。。。

 

文章评论

程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
每天工作4小时的程序员
每天工作4小时的程序员
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员应该关注的一些事儿
程序员应该关注的一些事儿
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
老程序员的下场
老程序员的下场
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Java程序员必看电影
Java程序员必看电影
程序员和编码员之间的区别
程序员和编码员之间的区别
那些争议最大的编程观点
那些争议最大的编程观点
我的丈夫是个程序员
我的丈夫是个程序员
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
鲜为人知的编程真相
鲜为人知的编程真相
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
10个调试和排错的小建议
10个调试和排错的小建议
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
一个程序员的时间管理
一个程序员的时间管理
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
如何成为一名黑客
如何成为一名黑客
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
我是如何打败拖延症的
我是如何打败拖延症的
程序员的鄙视链
程序员的鄙视链
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
漫画:程序员的工作
漫画:程序员的工作
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
代码女神横空出世
代码女神横空出世
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员都该阅读的书
程序员都该阅读的书
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
为什么程序员都是夜猫子
为什么程序员都是夜猫子
编程语言是女人
编程语言是女人
中美印日四国程序员比较
中美印日四国程序员比较
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有