[英]What are the differences between EventHandler and ElapsedEventHandler ?
到目前为止,我对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”? (即对于我们使用xxxxxEventHandler
等对象的集合X)
这些单词EventHandler和ElapsedEventHandler是否特定于我正在使用其事件的对象?
这个词是代表的名字。 它们特定于信息,它从对象传递,将事件引发给该事件的订阅者。 阅读下面传递的事件,代表和参数。
C#中的事件是一种类,当对象发生一些有趣的事情时,类可以向该类的客户端提供通知。 使用委托声明事件。
因此,如果您想通知客户端您的对象中发生了一些有趣的事情,您可以声明委托:
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
SomethingHappenedEventArgs
。 <SomethingHappenedEventArgs>
,或者它应该是自定义委托,名称为SomethingHappenedEventHandler
和signature void(object sender,SomethingHappenedEventArgs e) 在这里阅读更多。
不,事件名称是框架设计者选择的问题+他们很难与代表任何特定对象的事件相关联。
EventHandler defininton是:
[Serializable]
[ComVisible(true)]
public delegate void EventHandler(object sender, EventArgs e);
ElapsedEventHandler定义是:
public delegate void ElapsedEventHandler(object sender, ElapsedEventArgs e);
如您所见,它们是不同的delegate
类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.