C# event 的一个例子
2009-04-06 19:05
204 查看
using System;
class EventClass
{
//step1:create custom event args class(skip if system:EventArgs is used)
#region custom event args class
public class EventNameEventArgs:EventArgs
{
public string SenderID;
public string EventID;
public EventNameEventArgs(string SenderID,string EventID)
{
this.SenderID = SenderID;
this.EventID = EventID;
}
}
#endregion custom event args class
//step2:declare custom event delegate(skip if system:EventHandler is used)
#region custom event delegate
public delegate void EventNameEventHandler(object sender, EventNameEventArgs e);
#endregion custom event delegate
//step3: create event declaration(EventName) and a method(OnEventName) that raises the event
public event EventNameEventHandler EventName; //event delegate member
protected virtual void OnEventName(EventNameEventArgs e) //method to invoke the event delegate member
{
if (EventName != null) //if event delegate member is hooked with some function
{
EventName(this, e);//invoking the event delegate member and passing the event args
}
}
}//class EventClass
//event-raising class, derived from EventName Class, to call protected "OnEventName" method in due time
//("WHEN TO RAISE")
#region event-raising class
class EventRaisingClass:EventClass
{
protected string EventRaiserClassID;
public EventRaisingClass(string EventRaiserClassID)
{
this.EventRaiserClassID = EventRaiserClassID;
}
//method to raise the event while passing certain event args
public void RaiseEvent(string EventID)
{
EventNameEventArgs e = new EventNameEventArgs(this.EventRaiserClassID,EventID); //encapsulate the event parameters in the custom args
OnEventName(e); //raise the event
}
}
#endregion event-raising class
//EventRecieverClass with EventProcess method
#region event-reciever class
class EventRecieverClass
{
public EventRecieverClass(EventRaisingClass EventRaiser)
{
RegisterEvent(EventRaiser);
}
public void RegisterEvent(EventRaisingClass EventRaiser)
{
EventRaiser.EventName += new EventClass.EventNameEventHandler(EventProcess); //hook EventRaiser with EventReciever
}
void EventProcess(object sender, EventClass.EventNameEventArgs e)
{
Console.WriteLine("Event {0} is raised by Sender {1} ! ",e.EventID,e.SenderID); //事件响应函数
}
public void UnregisterEvent(EventRaisingClass EventRaiser)
{
EventRaiser.EventName -= new EventClass.EventNameEventHandler(EventProcess);
}
}
#endregion event-reciever class
#region Application class
class App
{
public static void Main()
{
//instantiate event-raising class
EventRaisingClass EventSender1 = new EventRaisingClass("发送者1");
EventRaisingClass EventSender2 = new EventRaisingClass("发送者2");
//instantiate event-reciever class
EventRecieverClass EventReviever1 = new EventRecieverClass(EventSender1); //hooked with EventSender1 when instantiating
EventSender1.RaiseEvent("事件1");
EventSender1.RaiseEvent("事件2");
EventSender2.RaiseEvent("事件3");
EventReviever1.RegisterEvent(EventSender2);
EventSender2.RaiseEvent("事件4");
EventSender1.RaiseEvent("事件5");
EventReviever1.UnregisterEvent(EventSender1);
EventSender1.RaiseEvent("事件6");
EventSender2.RaiseEvent("事件7");
EventSender2.RaiseEvent("事件8");
EventReviever1.UnregisterEvent(EventSender2);
EventSender1.RaiseEvent("事件9");
EventSender2.RaiseEvent("事件10");
Console.ReadKey();
}
}
#endregion Application class
class EventClass
{
//step1:create custom event args class(skip if system:EventArgs is used)
#region custom event args class
public class EventNameEventArgs:EventArgs
{
public string SenderID;
public string EventID;
public EventNameEventArgs(string SenderID,string EventID)
{
this.SenderID = SenderID;
this.EventID = EventID;
}
}
#endregion custom event args class
//step2:declare custom event delegate(skip if system:EventHandler is used)
#region custom event delegate
public delegate void EventNameEventHandler(object sender, EventNameEventArgs e);
#endregion custom event delegate
//step3: create event declaration(EventName) and a method(OnEventName) that raises the event
public event EventNameEventHandler EventName; //event delegate member
protected virtual void OnEventName(EventNameEventArgs e) //method to invoke the event delegate member
{
if (EventName != null) //if event delegate member is hooked with some function
{
EventName(this, e);//invoking the event delegate member and passing the event args
}
}
}//class EventClass
//event-raising class, derived from EventName Class, to call protected "OnEventName" method in due time
//("WHEN TO RAISE")
#region event-raising class
class EventRaisingClass:EventClass
{
protected string EventRaiserClassID;
public EventRaisingClass(string EventRaiserClassID)
{
this.EventRaiserClassID = EventRaiserClassID;
}
//method to raise the event while passing certain event args
public void RaiseEvent(string EventID)
{
EventNameEventArgs e = new EventNameEventArgs(this.EventRaiserClassID,EventID); //encapsulate the event parameters in the custom args
OnEventName(e); //raise the event
}
}
#endregion event-raising class
//EventRecieverClass with EventProcess method
#region event-reciever class
class EventRecieverClass
{
public EventRecieverClass(EventRaisingClass EventRaiser)
{
RegisterEvent(EventRaiser);
}
public void RegisterEvent(EventRaisingClass EventRaiser)
{
EventRaiser.EventName += new EventClass.EventNameEventHandler(EventProcess); //hook EventRaiser with EventReciever
}
void EventProcess(object sender, EventClass.EventNameEventArgs e)
{
Console.WriteLine("Event {0} is raised by Sender {1} ! ",e.EventID,e.SenderID); //事件响应函数
}
public void UnregisterEvent(EventRaisingClass EventRaiser)
{
EventRaiser.EventName -= new EventClass.EventNameEventHandler(EventProcess);
}
}
#endregion event-reciever class
#region Application class
class App
{
public static void Main()
{
//instantiate event-raising class
EventRaisingClass EventSender1 = new EventRaisingClass("发送者1");
EventRaisingClass EventSender2 = new EventRaisingClass("发送者2");
//instantiate event-reciever class
EventRecieverClass EventReviever1 = new EventRecieverClass(EventSender1); //hooked with EventSender1 when instantiating
EventSender1.RaiseEvent("事件1");
EventSender1.RaiseEvent("事件2");
EventSender2.RaiseEvent("事件3");
EventReviever1.RegisterEvent(EventSender2);
EventSender2.RaiseEvent("事件4");
EventSender1.RaiseEvent("事件5");
EventReviever1.UnregisterEvent(EventSender1);
EventSender1.RaiseEvent("事件6");
EventSender2.RaiseEvent("事件7");
EventSender2.RaiseEvent("事件8");
EventReviever1.UnregisterEvent(EventSender2);
EventSender1.RaiseEvent("事件9");
EventSender2.RaiseEvent("事件10");
Console.ReadKey();
}
}
#endregion Application class
相关文章推荐
- C# event 的一个例子
- 一个C#中使用 event 和 delegate的小例子。
- c#项目中遇到的add event 的一个小例子
- c#学习笔记之九 事件(event)的使用,一个简单的例子揭示其设计理念
- c# 学习笔记之九 事件(event)的使用,一个简单例子揭示机理
- 一个字符串的加密和解密的例子c#
- 一个简单的C#多线程间同步的例子
- (转贴)一个C#动态编译的小例子
- 原创 导弹能否摧毁目标?一个简单的例子说明c# 中property(性质)的用法
- [转]一个简单的C#多线程间同步的例子
- [转] 学习C#静态函数及变量的一个精典例子
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子
- 用C#实现RSA加密的一个小例子
- 一个例子搞明白c#接口与封装变化的内涵
- 一个简单的C#多线程间同步的例子
- 收了100元辛苦费,写了一个最简单的C#ASP.NET的3层架构例子代码
- C# hook的一个简单例子
- 一个简单的C#委托小例子
- c#中子线程控制进度条的一个简单例子(多线程问题)
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。