C#事件机制(记住流程)
转自:http://jimmyloveforever.blog.163.com/blog/static/119775247200951303935836/
1,C#事件机制是基于委托实现的,因此要首先定义一个委托EventHandler:
public delegate void EventHandler(object from , myEventArgs e)
System.EventArgs是包含事件数据的类的基类,在代码中可直接使用EventArgs类。
myEventArgs类派生于EventArgs类,实现自定义事件数据的功能。这里from表示发生事件的对象。
2,定义事件格式为:
2,定义事件格式为:
event 事件的委托名 事件名
如事件TextOut定义:
public event EventHandler TextOut;
3,事件的激活一般写成:
if (TextOut != null)
TextOut(this,new EventArgs());
检查TextOut事件有没有被订阅,如不为null,则表示有用户订阅。订阅事件的是
TestApp类,首先实例化EventSource,然后订阅事件:
evsrc.TextOut += new EventSource.EventHandler(CatchEvent);
也可以取消订阅:
evsrc.TextOut -= new EventSource.EventHandler(CatchEvent);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; // 定义事件包含数据 public class MyEventArgs : EventArgs { private string StrText; public MyEventArgs(string StrText) { this.StrText = StrText; } public string GetStrText { get { return StrText; } } } // 发布事件的类 class EventSource { MyEventArgs EvArgs = new MyEventArgs("触发事件"); // 定义委托 public delegate void EventHandler(object sender, MyEventArgs e); // 定义事件 public event EventHandler TextOut; // 激活事件的方法 public void TriggerEvent() { if (TextOut == null) TextOut(this, EvArgs); } } // 订阅事件的类 class TestApp { public static void Main() { EventSource evsrc = new EventSource(); // 订阅事件 evsrc.TextOut += new EventSource.EventHandler(CatchEvent); // 触发事件 evsrc.TriggerEvent(); Console.WriteLine("------"); // 取消订阅事件 evsrc.TextOut -= new EventSource.EventHandler(CatchEvent); // 触发事件 evsrc.TriggerEvent(); Console.WriteLine("------"); // 事件订阅已取消,什么也不执行 TestApp theApp = new TestApp(); evsrc.TextOut += new EventSource.EventHandler(theApp.InstanceCatch); evsrc.TriggerEvent(); Console.WriteLine("------"); } // 处理事件的静态方法 public static void CatchEvent(object from, MyEventArgs e) { Console.WriteLine("CatchEvent:{0}", e.GetStrText); } // 处理事件的方法 public void InstanceCatch(object from, MyEventArgs e) { Console.WriteLine("InstanceCatch:{0},e.GetStrText"); } }