C# 事件(Event)学习笔记

什么是事件?

事件是C#中的一种编程模型,它用于在对象之间传递消息。事件是委托类型的实例,它允许其他对象注册为事件处理程序,以便在事件发生时接收通知。

事件的基本结构

事件通常在一个类中定义,并在另一个类中使用。以下是一个基本的事件结构:

csharpCopy Code
public delegate void EventHandler(object sender, EventArgs e); class MyClass { public event EventHandler MyEvent; protected virtual void OnMyEvent() { if (MyEvent != null) MyEvent(this, EventArgs.Empty); } }

这里我们定义了一个名为MyEvent的事件,它使用了一个名为EventHandler的事件处理程序委托类型。当事件被触发时,我们调用一个名为OnMyEvent()的方法,该方法检查是否有任何事件处理程序注册,并向所有处理程序发送通知。

如何使用事件?

假设我们有一个名为Button的类,它允许用户单击按钮并触发事件。我们想要在按钮单击时显示一个消息框。

首先,我们需要创建一个事件处理程序来处理按钮单击事件:

csharpCopy Code
class ButtonHandler { public void ShowMessage(object sender, EventArgs e) { MessageBox.Show("Button clicked!"); } }

然后,我们需要在Button类中定义并触发Click事件:

csharpCopy Code
class Button { public event EventHandler Click; protected virtual void OnClick() { if (Click != null) Click(this, EventArgs.Empty); } public void ClickButton() { OnClick(); } }

在这个例子中,Button类定义了一个名为Click的事件。当用户单击按钮时,我们调用OnClick()方法并触发了Click事件。

现在我们可以在另一个类中创建一个Button实例,并将我们的事件处理程序添加到Click事件中:

csharpCopy Code
class Program { static void Main(string[] args) { Button button = new Button(); ButtonHandler handler = new ButtonHandler(); button.Click += handler.ShowMessage; button.ClickButton(); } }

在这个例子中,我们创建了一个Button实例,并创建了一个名为handlerButtonHandler对象。然后,我们将handlerShowMessage方法添加到buttonClick事件中,并调用ClickButton()方法来模拟按钮单击事件。

Click事件被触发时,我们的ShowMessage方法被调用,并显示一个消息框,表明按钮已经被单击。

实例

下面是一个更完整的示例,它演示了如何使用事件来触发一个简单的计数器:

csharpCopy Code
using System; namespace EventExample { public delegate void CountEventHandler(int count); class Counter { private int count = 0; public event CountEventHandler CountChanged; public void Increment() { count++; OnCountChanged(); } public void Decrement() { count--; OnCountChanged(); } protected virtual void OnCountChanged() { if (CountChanged != null) CountChanged(count); } } class Program { static void Main(string[] args) { Counter counter = new Counter(); counter.CountChanged += new CountEventHandler(CountChanged); counter.Increment(); counter.Increment(); counter.Decrement(); } static void CountChanged(int count) { Console.WriteLine("Count changed: " + count); } } }

在这个示例中,我们创建了一个名为Counter的类,它包含两个方法Increment()Decrement(),它们将计数器增加或减少。我们定义了一个名为CountChanged的事件,并在该事件触发时向所有已注册的处理程序发送通知。

Main()方法中,我们创建了一个Counter实例并将一个名为CountChanged的事件处理程序添加到CountChanged事件中。然后我们逐步增加和减少计数器,每次计数器变化时,CountChanged事件都会被触发,并调用我们的CountChanged()方法来显示计数器的当前值。

输出如下:

Copy Code
Count changed: 1 Count changed: 2 Count changed: 1