C#学习笔记——事件
?
事件被触发时,它调用委托来依次调用调用列表中的方法。
?
public eventEventHandler Elapsed;
?
它必须声明在类或结构中,和其他成员一样;
我们不能在一段可执行代码中声明事件;
public delegatevoid EventHandler(object sender, EventArgs e);
?
事件成员本身只是保存了需要被调用的事件处理程序。如果事件没有被触发,什么都不会发生。我们需要确保在合适的时候有代码来做这件事情。
private void OnOneSecond(object source, EventArgs args)
{
if (Elapsed!=null)??? //确认有方法可以执行
}
//下面的代码确认OnOneSecond方法每1000毫秒被调用一次
…
Console.WriteLine("AnonyNous method.");
它从两个不同的类实例注册两个事件处理程序。
在注册事件处理程序后,它休眠2秒。在这段时间内,计时器类会触发两次事件,两个事件处理器每次都会被执行。
?
}
mc.Elapsed += ca.TimeHandlerA;???????//添加处瑾程序A(实例)
mc.Elapsed += ClassB.TimerHandlerB;??? ????//添加处理程序B(尊态的)
Thread.Sleep(2250);
}
Class B handlercalled
...
mc.Elapsed+= ca.TimerHandlerA;??? //添加实例事件处理程序A
mc.Elapsed+=ClassB.TimerHandlerB;??? //添加静态事件处理程序B
?
Thread.Sleep(2250);//休眠2秒以上时间
mc.Elapsed-=ClassB.TimerHandlerB;???//移除静态事件处理程序B
Console.WriteLine(“Class B event handler removed”);
Thread.Sleep(2250);??? //休眠2秒以上时间
这段代码产生了如下的输出。前4行是在前2秒内两个处理程序被调用两次的结果。在ClassB的处理程序被移除后,在最后的2秒内只有ClassA的实例处理程序被调用。
public delegate void EventHandler(object sender, EventArgs e);
EventArgs被设计为不能传递任何数据。它用于不需要传递数据的事件处理程序——通常会被忽略。
如果你希望传递数据,必须声明一个从EventArgs继承的类,使用合适的字段来保存需要传递的数据。
尽管EventArgs类实际上并不传递数据,但它是使用EventHandler委托模式的重要一部分。不管参数使用的实际类型是什么,object类和EventArgs总是基类。这样EventHandler就能提供一个对所有事件和事件处理器都通用的签名,只允许2个参数,而不是各自都有不同签名。
为了向自己的事件处理程序的第二个参数传入数据,并且又符合标准惯例,我们需要声明一个派生自EventArgs的自定义类,它可以保存我们所需传入的数据。类的名称应该以EventArgs结尾。
}
public event EventHandler<MyTCEventArgs> Elapsed; ??//事件声明
private void OnOneSecond(object obj, EventArgs e)
{
}
public? void? TimerHandlerA(object obj,MyTCEventArgs e)
{
??? Console.WriteLine(“Class AMessage:{0}”,Message);??? //事件处理程序
}
static void Main()
ClassA ca = neti ClassA();
MyTimerClass mc = new MyTimerClass();
Class A Message:? Message from OnOneSecond
?
?
答案是:OnOneSecond本身就是一个事件处理程序,该事件处理程序订阅了System.Timers命名空间中Timer类的一个事件。Timer的事件每1000毫秒触发一次并调用OnOneSecond事件处理程序,然后它再触发MyTimerClass类中的Elapsed事件。
public eventEventHandler Elapsed;
private voidOnOneSecond(object obj, EventArgs e)
{
if (Elapsed != null)
Elapsed(obj, e);
}
//-----------------------------
private System.Timers.Timer MyPrivateTimer;? //私有计时器
public MyTimerClass()??? //构造函数
{
MyPrivateTimer=new System.Timers.Timer();??? //创建私有计时器
MyPrivateTimer.Elapsed+=OnOneSecond;??? ????//附加事件处理程序
MyPrivateTimer.lnterval =1000;
MyPrivateTirner.Enabled = true;
}
….? //执行+=运算符的代码
….?? //执行-=运算符的代码
事件访问器表现为void方法,也就是不能使用会返回值的return语句。
?
?
?
?