C#中的事件是一种特殊的委托类型,它可以使对象在某个特定的时间点上引发或触发某个动作或事件。事件可以用于编写响应用户交互、处理消息通知等许多用途。
一、事件的定义
事件定义的基本语法格式如下:
public delegate void SomeEventHandler(object sender, EventArgs e);
public class SomeClass
{
public event SomeEventHandler SomeEvent;
protected virtual void OnSomeEvent(EventArgs e)
{
if (SomeEvent != null)
SomeEvent(this, e);
}
}
这里,我们先定义了一个委托类型SomeEventHandler
,用来描述事件处理函数的参数和返回值。然后,在类SomeClass
中声明了一个名为SomeEvent
的事件,类型为SomeEventHandler
。最后,我们定义了一个受保护的、虚拟的方法OnSomeEvent
,用来触发事件并传递事件参数。
二、事件的使用
下面,我们来看一下如何在应用程序中定义和使用事件。
示例一:在控制台应用程序中使用事件
using System;
namespace ConsoleApp1
{
public delegate void MyEventHandler(object sender, EventArgs e);
public class MyEventSource
{
public event MyEventHandler MyEvent;
public void InvokeMyEvent()
{
var e = new EventArgs();
OnMyEvent(e);
}
protected virtual void OnMyEvent(EventArgs e)
{
if (MyEvent != null)
{
Console.WriteLine("Event is invoked.");
MyEvent(this, e);
}
}
}
public class MyEventHandler1
{
public void HandleEvent(object sender, EventArgs e)
{
Console.WriteLine("MyEventHandler1 is handling the event.");
}
}
public class MyEventHandler2
{
public void HandleEvent(object sender, EventArgs e)
{
Console.WriteLine("MyEventHandler2 is handling the event.");
}
}
class Program
{
static void Main(string[] args)
{
var source = new MyEventSource();
var handler1 = new MyEventHandler1();
var handler2 = new MyEventHandler2();
source.MyEvent += new MyEventHandler(handler1.HandleEvent);
source.MyEvent += new MyEventHandler(handler2.HandleEvent);
source.InvokeMyEvent();
}
}
}
在这个示例中,我们定义了一个名为MyEventSource
的事件源对象,它定义了一个名为MyEvent
的事件。我们还定义了两个事件处理函数MyEventHandler1
和MyEventHandler2
,它们都实现了MyEventHandler
委托类型所要求的参数和返回值。
在Main
函数中,我们创建了一个MyEventSource
对象source
,并将MyEventHandler1
和MyEventHandler2
的处理函数添加到source
的MyEvent
事件中。最后,我们调用source
对象的InvokeMyEvent
方法,从而触发MyEvent
事件并由添加的事件处理函数进行处理。
执行该应用程序,输出结果如下:
Event is invoked.
MyEventHandler1 is handling the event.
MyEventHandler2 is handling the event.
可以看到,在触发MyEvent
事件后,MyEventHandler1
和MyEventHandler2
都被调用,顺利地处理了该事件。
示例二:在Windows窗体应用程序中使用事件
下面,我们来看一下如何在Windows窗体应用程序中使用事件。
using System;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Button1 is clicked.");
OnButton1Clicked(new EventArgs());
}
public event EventHandler Button1Clicked;
protected virtual void OnButton1Clicked(EventArgs e)
{
if (Button1Clicked != null)
Button1Clicked(this, e);
}
}
public class MyEventHandler1
{
public void HandleEvent(object sender, EventArgs e)
{
MessageBox.Show("MyEventHandler1 is handling the event.");
}
}
public class MyEventHandler2
{
public void HandleEvent(object sender, EventArgs e)
{
MessageBox.Show("MyEventHandler2 is handling the event.");
}
}
public partial class Form1 : Form
{
MyEventHandler1 handler1 = new MyEventHandler1();
MyEventHandler2 handler2 = new MyEventHandler2();
public Form1()
{
InitializeComponent();
Button1Clicked += new EventHandler(handler1.HandleEvent);
Button1Clicked += new EventHandler(handler2.HandleEvent);
}
}
}
在这个示例中,我们在Windows窗体应用程序中定义了一个名为Form1
的窗体对象。该窗体上有一个名为button1
的按钮。
在窗体代码中,我们先定义了两个事件处理函数MyEventHandler1
和MyEventHandler2
,它们都实现了EventHandler
委托类型所要求的参数和返回值。
在Form1
窗体中,我们定义了一个名为Button1Clicked
的事件,类型为EventHandler
。该事件会被在button1_Click
函数中调用的OnButton1Clicked
方法触发,并由添加的事件处理函数进行处理。
在Form1
窗体的构造函数中,我们创建了一个MyEventHandler1
对象handler1
和一个MyEventHandler2
对象handler2
,并将它们添加到Button1Clicked
事件中。
当用户单击按钮时,button1_Click
函数会弹出一个消息框,并触发Button1Clicked
事件。该事件会被添加的事件处理函数进行处理,并弹出相应的消息框。
执行该应用程序,单击按钮后,弹出消息框,并输出结果如下:
MyEventHandler1 is handling the event.
MyEventHandler2 is handling the event.
可以看到,在Windows窗体应用程序中使用事件和在控制台应用程序中使用事件的步骤类似,只是窗体和控件对象的事件定义和处理稍有不同。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中事件的定义和使用 - Python技术站