活动代表扮演什么角色?

时间:2020-07-10 08:17:35

标签: c#

我有一个问题, 关于事件代表。我看了一眼,但我不确定我是否仍然明白。 例如,我在构造函数中看到了事件委托,这是调用该方法的唯一地方。

Player.Finished+= new FinishedEventHandler(Finished);

当我直接调用该方法时,它产生了完全不同的影响,因为仅调用Player.Finished+= new FinishedEventHandler(Finished);似乎无济于事。也许您可以将我指向某个网站,在该网站上我可以找到更好的解释方式?

1 个答案:

答案 0 :(得分:4)

这可以帮助您了解事件和代表:

.NET中的事件基于委托模型。委托模型遵循观察者设计模式,该模式使订阅者可以向提供者注册并从提供者接收通知。事件发送方推送事件已发生的通知,事件接收方接收该通知并定义对它的响应。本文介绍了委托模型的主要组件,如何在应用程序中使用事件以及如何在代码中实现事件。

事件是对象发送的消息,用于指示操作的发生。该操作可能是由于用户交互(例如单击按钮)引起的,也可能是由于某些其他程序逻辑(例如更改属性的值)引起的。引发事件的对象称为事件发送者。事件发送者不知道哪个对象或方法将接收(处理)它引发的事件。该事件通常是事件发送者的成员;例如,Click事件是Button类的成员,而PropertyChanged事件是实现INotifyPropertyChanged接口的类的成员。

要定义事件,请在事件类的签名中使用C#事件或Visual Basic Event关键字,并指定事件的委托类型。代表将在下一部分中描述。

通常,要引发事件,请添加一个标记为“受保护的和虚拟的”(在C#中)或“受保护的且可重写的”(在Visual Basic中)的方法。将此方法命名为OnEventName;例如OnDataReceived。该方法应采用一个参数来指定事件数据对象,该对象是EventArgs类型的对象或派生类型。您提供此方法以使派生类可以重写引发事件的逻辑。派生类应始终调用基类的OnEventName方法,以确保已注册的委托接收事件。

一个简单的示例是Button控件:单击它时,将引发事件OnClick,并且该控件使用以下命令调用已订阅该控件的所有委托人:

Click += SomeMethod;

或者(相同):

Click += new EventHandler(SomeMethod);

如果是事实,它将在事件处理程序列表中添加对该方法的引用。

事件只是在事件发生时要调用的方法的列表,例如单击按钮。

委托只是没有主体实现的方法的签名,也称为 prototype ,用作类型,在添加事件时具有强类型到按钮单击之类的事件处理程序。因此,当您为实现的方法分配名称时,它必须与委托签名匹配(返回类型和参数,除人类以外,委托本身的名称都不相关)。

我们也可以使用lambda:

myButton1.Click += (sender, e) => Close();

myButton2.Click += (sender, e) => { MessageBox.Show("Closing"); Close() };

Handling and raising events (MS Docs)

C# - Events(TutorialsPoint)

C# - Events (TutorialsTeacher)

What are C# Events? (YouTube)

C# Tutorial: Events/Event Handlers (YouTube)

还有一些建议:

How do I improve my knowledge in C#