到目前为止,在我对 c# 的有限使用中,我已经订阅了几个事件。
为什么以下两个代码片段使用两个不同的词 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
等)
最佳答案
Are these words EventHandler and ElapsedEventHandler specific to the object whose event I'm using?
这句话是代表的名字。它们特定于从对象传递的信息,该对象将事件引发给该事件的订阅者。阅读下面的事件、委托(delegate)和参数传递。
C# 中的事件是类在某个对象发生某些有趣的事情时向该类的客户端提供通知的一种方式。使用 delegates 声明事件.
所以,如果你想通知客户你的对象发生了一些有趣的事情,你可以声明委托(delegate):
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
}
当您需要在通知客户端时传递一些额外的数据时,您应该使用不同的委托(delegate)类型,它带有一些参数。例如,如果您想向客户端传递一些消息,请更改事件的委托(delegate)类型:
public delegate void SomethingHappenedDelegate(string message);
现在您应该更改事件处理程序以对应此委托(delegate)类型:
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
}
因此,所有事件都具有某种委托(delegate)类型。该委托(delegate)的定义描述了哪些参数应该接收方法,哪些将处理事件。在您的代码中,您使用了两个事件 - 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);
从定义中可以看出,这些委托(delegate)具有相同的第一个参数(发送者)和不同的最后一个参数。因此,这些事件的处理程序也应该具有不同的签名,这些签名应该与这些委托(delegate)相匹配。
您可能想知道,为什么第二个参数的名称以 EventArgs 结尾。如果你想通知其他对象,SomethingHappened,那么在 C# 中存在以下约定:
- 事件名称应为
SomethingHappened
- 如果客户端需要传递一些额外的数据,这些数据封装在对象中,该对象派生自 EventArgs 类:
SomethingHappenedEventArgs
. - 事件代表应该是EventHandler (如果没有附加信息应该传递给客户),或者它应该是通用类型 EventHandler
<SomethingHappenedEventArgs>
,或者它应该是名称为SomethingHappenedEventHandler
的自定义委托(delegate)和签名无效(对象发送者,SomethingHappenedEventArgs e)
阅读更多 here .
关于c# - EventHandler 和 ElapsedEventHandler 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10242591/