EventHandler和ElapsedEventHandler有什么区别?

问题描述:

到目前为止,在我对c#的有限使用中,我订阅了几个事件。 为什么以下两个代码片段使用两个不同的单词EventHandlerElapsedEventHandlerEventHandler和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); 

是针对其事件我使用的对象,这些话EventHandlerElapsedEventHandler?还是有一整套对象,我必须使用“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.ExitedTimer.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

+0

你的名字似乎有点不合适_lazy_ berezovsky ....感谢您的帮助 – whytheq 2012-04-20 11:43:24

+0

@whytheq我害怕如果我不是懒惰会发生什么事情:) – 2012-04-20 13:05:49

+0

我痴迷于尝试学习C#在此刻.. ..这是从我目前的知识(VBA和SQL)如此巨大的跳跃,像你的答案赞赏,但有点可怕! – whytheq 2012-04-20 14:06:50

不,事件名称是框架设计器选择的问题+它们与表示任何特定对象事件的代表紧密耦合。

事件处理defininton是:

[Serializable] 
[ComVisible(true)] 
public delegate void EventHandler(object sender, EventArgs e); 

ElapsedEventHandler definiton是:

public delegate void ElapsedEventHandler(object sender, ElapsedEventArgs e); 

正如你可以看到他们是不同类型的delegate

+0

...所以对于不同的对象(不是一个进程或计时器)它可能是上述之一;或者它可能是一个不同的处理程序? – whytheq 2012-04-20 08:27:15

+0

这是一个选择的问题。如果你写自己的班级,你可以拥有他们两个,或者他们中的一个。在这种情况下,为Timer定义了一个委托类型,这更适合于它的架构。只是建筑师选择的问题。 – Tigran 2012-04-20 08:29:39