事件有很多,比如说鼠标的事件:MouserMove,MouserDown等,键盘的事件:KeyUp,KeyDown,KeyPress。
有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。
比如在WinForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click += new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。
EventHandler以及其它自定义的事件委托都是一类特殊的委托,他们有相同的形式:
delegate void 事件委托名(object sender,EventArgs e);
object用来传递事件的发生者,比如二中的Button控件就是一个事件发生者;EventArgs用来传递事件的细节。
示例:

using System;
namespace EventDemo
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class EventReceiver
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
EventSender c1 = new EventSender();
//委托实例化后绑定到事件
c1.OnUserRequest += new UserRequest(c1_OnUserRequest);
c1.Run();
}
private static void c1_OnUserRequest(object sender, EventArgs e)
{//事件处理方法
Console.WriteLine("\t你触发了事件!");
}
}
//定义委托
public delegate void UserRequest(object sender,EventArgs e);
/// <summary>
/// 事件发送类
/// </summary>
public class EventSender
{
public EventSender()
{
}
//定义一个委托类型的事件
public event UserRequest OnUserRequest;
public void Run()
{
while(true)
{
if(Console.ReadLine() == "a")
{
//事件监听,产生事件
OnUserRequest(this,new EventArgs());
}
}
}
}
}
带事件数据的事件示例:

using System;
namespace EventDemo
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class EventReceiver
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
EventSender c1 = new EventSender();
//委托实例化后绑定到事件
c1.OnUserRequest += new UserRequest(c1_OnUserRequest);
c1.Run();
}
private static void c1_OnUserRequest(object sender, OnUserRequestEventArgs e)
{//事件处理方法
Console.WriteLine("你触发了事件"+e.InputText);
}
}
//定义委托
public delegate void UserRequest(object sender,OnUserRequestEventArgs e);
/// <summary>
/// 带事件数据的事件类,从EventArgs继承
/// </summary>
public class OnUserRequestEventArgs : System.EventArgs
{
private string _InputText;
public string InputText
{
get
{
return _InputText;
}
set
{
_InputText = value;
}
}
}
/// <summary>
/// 事件发送类
/// </summary>
public class EventSender
{
public EventSender()
{
}
//定义一个委托类型的事件
public event UserRequest OnUserRequest;
public void Run()
{
while(true)
{
if(Console.ReadLine() == "a")
{
//事件监听,产生事件
OnUserRequestEventArgs e = new OnUserRequestEventArgs();
e.InputText = "a";
OnUserRequest(this,e);
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)