一尘不染

了解C#中的事件和事件处理程序

c#

我了解事件的目的,尤其是在创建用户界面的上下文中。我认为这是创建事件的原型:

public void EventName(object sender, EventArgs e);

事件处理程序做什么,为什么需要它们,以及如何创建事件处理程序?


阅读 288

收藏
2020-05-19

共1个答案

一尘不染

要了解事件处理程序,您需要了解委托。在C#中,您可以将委托视为方法的指针(或引用)。这很有用,因为指针可以作为值传递。

代表的中心概念是其签名或形状。即(1)返回类型和(2)输入参数。例如,如果我们创建一个委托void MyDelegate(object sender, EventArgs e),则它只能指向return
void并采用objectand的方法EventArgs。有点像方孔和方钉。因此,我们说这些方法与委托具有相同的签名或形状。

因此,了解了如何创建对方法的引用之后,我们来考虑事件的目的:当系统中其他地方发生事件时,我们希望使某些代码得以执行-或“处理事件”。为此,我们为要执行的代码创建特定的方法。事件和要执行的方法之间的粘合是委托。该事件必须在内部存储指向引发该事件时要调用的方法的指针的“列表”。*当然,要能够调用方法,我们需要知道要传递给它的参数!我们使用委托作为事件与将要调用的所有特定方法之间的“契约”。

因此,默认值EventHandler(以及许多类似的默认值)表示 方法特定形状 (再次是void / object-
EventArgs)。声明事件时,您通过指定委托来说明事件将调用 哪种形式的方法 (EventHandler):

//This delegate can be used to point to methods
//which return void and take a string.
public delegate void MyEventHandler(string foo);

//This event can cause any method which conforms
//to MyEventHandler to be called.
public event MyEventHandler SomethingHappened;

//Here is some code I want to be executed
//when SomethingHappened fires.
void HandleSomethingHappened(string foo)
{
    //Do some stuff
}

//I am creating a delegate (pointer) to HandleSomethingHappened
//and adding it to SomethingHappened's list of "Event Handlers".
myObj.SomethingHappened += new MyEventHandler(HandleSomethingHappened);

//To raise the event within a method.
SomethingHappened("bar");

(*这是.NET中事件的关键,它剥去了“魔术”-事件实际上是在幕后,实际上只是一个具有相同“形状”的方法列表。该列表存储在事件所在的位置。何时事件是“引发的”,实际上只是“遍历此方法列表并使用这些值作为参数调用每个方法”。分配事件处理程序只是将方法添加到此方法列表中的一种更简便的方法被称为)。

2020-05-19