读书人

C#学习札记事件

发布时间: 2012-12-25 16:18:28 作者: rapoo

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语句。

?

?

?

?

读书人网 >C#

热点推荐