C# 事件(Event)学习笔记
什么是事件?
事件是C#中的一种编程模型,它用于在对象之间传递消息。事件是委托类型的实例,它允许其他对象注册为事件处理程序,以便在事件发生时接收通知。
事件的基本结构
事件通常在一个类中定义,并在另一个类中使用。以下是一个基本的事件结构:
csharpCopy Codepublic 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 Codeclass ButtonHandler
{
public void ShowMessage(object sender, EventArgs e)
{
MessageBox.Show("Button clicked!");
}
}
然后,我们需要在Button
类中定义并触发Click
事件:
csharpCopy Codeclass 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 Codeclass Program
{
static void Main(string[] args)
{
Button button = new Button();
ButtonHandler handler = new ButtonHandler();
button.Click += handler.ShowMessage;
button.ClickButton();
}
}
在这个例子中,我们创建了一个Button
实例,并创建了一个名为handler
的ButtonHandler
对象。然后,我们将handler
的ShowMessage
方法添加到button
的Click
事件中,并调用ClickButton()
方法来模拟按钮单击事件。
当Click
事件被触发时,我们的ShowMessage
方法被调用,并显示一个消息框,表明按钮已经被单击。
实例
下面是一个更完整的示例,它演示了如何使用事件来触发一个简单的计数器:
csharpCopy Codeusing 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 CodeCount changed: 1
Count changed: 2
Count changed: 1