C#基础加强篇—委托、Lambda表达式和事件(下)
2015-03-21 19:24
549 查看
[b]3.事件[/b]
事件作为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);
下面再来看一个示例:
可以对照着上面的介绍,来找一下事件的几个相关元素。
委托、Lamada表达式、事件的一些基础知识完。。。。
这是我第一次写博客,本人也还是在大学里摸索的渣渣,几乎都是书上的一些内容,感觉自己一个字一个字打出来印象会比较深刻,理解也更到位,大神勿喷。。。
事件作为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);
下面再来看一个示例:
public class MyEventArgs:EventArgs { //定义事件包含数据 private string StrText; public MyEventArgs(string StrText) { this.StrText = StrText; } public string GetStrText { get { return StrText; } } } public class EventSource {//发布事件的类 MyEventArgs EvArgs = new MyEventArgs("触发事件"); public delegate void EventHandler(object from, MyEventArgs e);//定义委托 public event EventHandler TextOut;//定义事件 public void TriggerEvent()//激活事件的方法 { if(TextOut!=null) { TextOut(this, EvArgs); } } } class Test {//订阅事件的类 static void Main(string[] args) { EventSource evsrc = new EventSource(); evsrc.TextOut += new EventSource.EventHandler(CatchEvent);//订阅事件 evsrc.TriggerEvent();//触发事件 Console.WriteLine("--------------"); evsrc.TextOut -= new EventSource.EventHandler(CatchEvent);//取消订阅事件 evsrc.TriggerEvent();//由于订阅已取消,什么也不执行 Console.WriteLine("--------------"); Test theApp=new Test(); evsrc.TextOut += new EventSource.EventHandler(theApp.InstanceCatch); evsrc.TriggerEvent(); } private static void CatchEvent(object from, MyEventArgs e) {//事件处理程序 Console.WriteLine("CatchEvent:{0}", e.GetStrText); } private void InstanceCatch(object from, MyEventArgs e) {//事件处理程序 Console.WriteLine("InstanceCatch:{0}", e.GetStrText); } }
可以对照着上面的介绍,来找一下事件的几个相关元素。
委托、Lamada表达式、事件的一些基础知识完。。。。
这是我第一次写博客,本人也还是在大学里摸索的渣渣,几乎都是书上的一些内容,感觉自己一个字一个字打出来印象会比较深刻,理解也更到位,大神勿喷。。。
相关文章推荐
- C#基础加强第五天--委托,事件与反射
- C#基础加强篇---委托、Lamada表达式和事件(中)
- C#事件和委托的基础知识模型
- C#基础-委托事件和类(Day8)
- C#基础笔记——委托(Delegate)和事件(Event)
- 一个例子帮你搞懂C#语言高级特性系列(02) --- 委托、事件和Lambda表达式
- 黑马程序员:C#基础篇(三)委托与事件
- C# 委托,事件和Lambda表达式
- C#基础知识回顾--委托事件
- C#基础知识梳理系列五:委托与事件(上)
- (C#)中断程序流程,处理事件(委托,事件,Lambda表达式)-2/3
- C#基础:委托、匿名方法、事件
- C#基础知识梳理系列五:委托与事件(下)
- C#基础系列--C#中委托与事件(一)
- C#事件和委托的基础知识模型
- 【c#基础4】C#+中的委托和事件
- C#基础系列--C#中委托与事件(三)
- C#基础知识梳理系列五:委托与事件(上)
- C# 在线培训之零基础入门 05:委托与事件
- C#基础原理拾遗——面试都爱问的委托和事件(纠正)