我有一个问题, 关于事件代表。我看了一眼,但我不确定我是否仍然明白。 例如,我在构造函数中看到了事件委托,这是调用该方法的唯一地方。
Player.Finished+= new FinishedEventHandler(Finished);
当我直接调用该方法时,它产生了完全不同的影响,因为仅调用Player.Finished+= new FinishedEventHandler(Finished);
似乎无济于事。也许您可以将我指向某个网站,在该网站上我可以找到更好的解释方式?
答案 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 (TutorialsTeacher)
C# Tutorial: Events/Event Handlers (YouTube)
还有一些建议: