EventHandler和ElapsedEventHandler有什么区别?
到目前为止,在我对c#的有限使用中,我订阅了几个事件。 为什么以下两个代码片段使用两个不同的单词EventHandler
和ElapsedEventHandler
?EventHandler和ElapsedEventHandler有什么区别?
myProcess = new Process();
myProcess.StartInfo.FileName = @"notepad.exe";
myProcess.Exited += new EventHandler(MyProcessExited);
相比:
myTimer = new System.Timers.Timer(tickLength);
myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
是针对其事件我使用的对象,这些话EventHandler
和ElapsedEventHandler
?还是有一整套对象,我必须使用“EventHandler”和不同的对象,我必须使用“ElapsedEventHandler”? (即对于我们使用的对象集X,我们使用xxxxxEventHandler
等)
这些词是EventHandler和ElapsedEventHandler特定于我正在使用的事件的 对象吗?
这个词是代表的名字。它们是特定于信息的,它是从对象传递来的,它将事件引发给该事件的订阅者。阅读下面传递的事件,代表和参数。
C#中的事件是类的一种方式,当对象发生一些有趣的事情时,可以向该类的客户端提供通知。事件使用delegates进行声明。
所以,如果你想通知你的对象发生了一些有趣的东西客户端,你可以声明委托:
public delegate void SomethingHappenedDelegate();
而在你的类中声明该类型的事件:
class Foo
{
public event SomethingHappenedDelegate SomethingHappened;
// other code, which raises SomethingHappened event
// when something interesting happened
}
当这个类的客户希望被通知发生了一些有趣的事情时,他们应该订阅SomethingHappened事件。和事件处理程序的签名必须匹配(在这种情况下SomethingHappenedDelegate)事件的类型:
static void Main(string[] args)
{
Foo foo = new Foo();
foo.SomethingHappened += new SomethingHappenedDelegate(Foo_SomethingHappened);
}
// this method should be: void MethodName()
static void Foo_SomethingHappened()
{
// you notified, that something happened
}
当你需要通知客户端时,通过一些额外的数据,你应该使用不同的委托类型,这需要一些论据。例如,如果你想传递一些信息给客户,改变事件的委托类型:
public delegate void SomethingHappenedDelegate(string message);
现在你应该改变事件处理程序来对应这种委托类型:
static void Foo_SomethingHappened(string message)
{
// you notified, that something happened and you recieved a message
}
另一个例子,如果我们想通过对象的实例,它引发的事件,以及一些额外的参数信息和时间:
public delegate void SomethingHappenedDelegate(object sender, string message, DateTime time);
那么我们应该有相同的签名事件处理程序:
static void Main(string[] args)
{
Foo foo1 = new Foo();
foo1.SomethingHappened += new SomethingHappenedDelegate(Foo_SomethingHappened);
Foo foo2 = new Foo();
foo2.SomethingHappened += new SomethingHappenedDelegate(Foo_SomethingHappened);
}
// we use same event handler for all SomethingHappened events
static void Foo_SomethingHappened(object sender, string message, DateTime time)
{
Foo foo = sender as Foo; // now we get object, which raised event
// and we can use message and time
}
所以,所有事件都有一些委托类型。该委托的定义描述哪些参数应该接收方法,哪些将处理事件。在您的代码中,您使用两个事件 - Process.Exited和Timer.Elapsed。让我们看看这些事件是如何定义的:
public event EventHandler Exited;
public event ElapsedEventHandler Elapsed;
这里你可以看到不同类型的代表:
public delegate void EventHandler(object sender, EventArgs e);
public delegate void ElapsedEventHandler(object sender, ElapsedEventArgs e);
你可以从定义看,这些代表有相同的第一个参数(发件人),和不同的最后参数。所以,这些事件的处理者也应该有不同的签名,这应该与这些代表相匹配。
您可能想知道,为什么第二个参数的名称以EventArgs结尾。如果你想通知其他对象,SomethingHappened,然后按照约定在C#中存在:
- 事件名称应该是
SomethingHappened
- 如果客户需要传递一些额外的数据,这些数据封装在对象,它派生来自EventArgs类:
SomethingHappenedEventArgs
。 - 事件委托应该EventHandler(如果没有额外的信息应该传递给客户端),或者它应该是通用型EventHandler
<SomethingHappenedEventArgs>
的,或者它应该是自定义的名称为SomethingHappenedEventHandler
和签名无效(对象发件人,SomethingHappenedEventArgs E) 委托
阅读全文here。
不,事件名称是框架设计器选择的问题+它们与表示任何特定对象事件的代表紧密耦合。
事件处理defininton是:
[Serializable]
[ComVisible(true)]
public delegate void EventHandler(object sender, EventArgs e);
ElapsedEventHandler definiton是:
public delegate void ElapsedEventHandler(object sender, ElapsedEventArgs e);
正如你可以看到他们是不同类型的delegate
。
你的名字似乎有点不合适_lazy_ berezovsky ....感谢您的帮助 – whytheq 2012-04-20 11:43:24
@whytheq我害怕如果我不是懒惰会发生什么事情:) – 2012-04-20 13:05:49
我痴迷于尝试学习C#在此刻.. ..这是从我目前的知识(VBA和SQL)如此巨大的跳跃,像你的答案赞赏,但有点可怕! – whytheq 2012-04-20 14:06:50