1 如何自定义事件?
1.1 什么是事件?
事件:事件是能够让类或对象具备通知能力的成员,站在事件的拥有者的角度,事件就是用来通知别人的工具
1.2 自定义事件
现在有一个例子
Jeff 准备告诉他的老师他的名字和学号
自定义声明事件
using System;
namespace EventTest
{
class EventDemo
{
static void Main(String[] args)
{
// student : 事件的拥有者
Student student = new Student();
// teacher : 事件的响应者
Teacher teacher = new Teacher();
// student.Test : 事件
// teacher.Listen : 事件处理器
// student.Test += Teacher.Listen : 订阅事件
student.Test += teacher.Listen;
string name = "Jeff";
int id = 4;
student.Talk(name,id);
}
}
// 1.1 自定义事件信息
// 自定义事件信息集成自 EventArgs
// .net 规定传递事件信息需要 EventArgs 作为后缀
public class TestEventArgs : EventArgs
{
public string name { get; set; }
public int id { get; set; }
}
// 1.2 声明委托
// .net 规定委托如果是为了事件, 那么需要 EventHandler 作为后缀
public delegate void TestEventHandler(Student student, TestEventArgs e);
public class Student
{
// 1.3 声明委托
private TestEventHandler testEventHandler;
// 1.4 声明事件
public event TestEventHandler Test
{
add
{
this.testEventHandler += value;
}
remove
{
this.testEventHandler -= value;
}
}
// 1.5 触发
public void Talk(string name, int id)
{
// 判断事件是否被订阅
if (this.testEventHandler != null)
{
// 添加事件信息
TestEventArgs e = new TestEventArgs();
e.id = id;
e.name = name;
// 通知订阅者
Console.WriteLine("Student : Hello teacher, my name is " + name + " and my id is " + id);
this.testEventHandler.Invoke(this,e);
}
}
}
class Teacher
{
// 1.6 事件处理器
public void Listen(Student student, TestEventArgs e)
{
string res = "Teacher : Now i know " + "your id is " + e.id + " and your name is " + e.name;
Console.WriteLine(res);
}
}
}
简略声明事件
using System;
namespace EventTest
{
class EventDemo
{
static void Main(String[] args)
{
// student : 事件的拥有者
Student student = new Student();
// teacher : 事件的响应者
Teacher teacher = new Teacher();
// student.Test : 事件
// teacher.Listen : 事件处理器
// student.Test += Teacher.Listen : 订阅事件
student.Test += teacher.Listen;
string name = "Jeff";
int id = 4;
student.Talk(name,id);
}
}
// 1.1 自定义事件信息
// 自定义事件信息集成自 EventArgs
// .net 规定传递事件信息需要 EventArgs 作为后缀
public class TestEventArgs : EventArgs
{
public string name { get; set; }
public int id { get; set; }
}
// 1.2 声明委托
// .net 规定委托如果是为了事件, 那么需要 EventHandler 作为后缀
public delegate void TestEventHandler(Student student, TestEventArgs e);
public class Student
{
// 1.3 声明事件
public event TestEventHandler Test;
// 1.4 触发
public void Talk(string name, int id)
{
// 判断事件是否被订阅
if (this.Test!= null)
{
// 添加事件信息
TestEventArgs e = new TestEventArgs();
e.id = id;
e.name = name;
// 通知订阅者
Console.WriteLine("Student : Hello teacher, my name is " + name + " and my id is " + id);
this.Test.Invoke(this,e);
}
}
}
class Teacher
{
// 1.5 事件处理器
public void Listen(Student student, TestEventArgs e)
{
string res = "Teacher : Now i know " + "your id is " + e.id + " and your name is " + e.name;
Console.WriteLine(res);
}
}
}
使用厂商准备的事件 EventHandler
using System;
namespace EventTest
{
class EventDemo
{
static void Main(String[] args)
{
// student : 事件的拥有者
Student student = new Student();
// teacher : 事件的响应者
Teacher teacher = new Teacher();
// student.Test : 事件
// teacher.Listen : 事件处理器
// student.Test += Teacher.Listen : 订阅事件
student.Test += teacher.Listen;
string name = "Jeff";
int id = 4;
student.Talk(name, id);
}
}
// 1.1 自定义事件信息
// 自定义事件信息集成自 EventArgs
// .net 规定传递事件信息需要 EventArgs 作为后缀
public class TestEventArgs : EventArgs
{
public string name { get; set; }
public int id { get; set; }
}
public class Student
{
// 1.2 声明事件
public event EventHandler Test;
// 1.3 触发
public void Talk(string name, int id)
{
// 判断事件是否被订阅
if (this.Test != null)
{
// 添加事件信息
TestEventArgs e = new TestEventArgs();
e.id = id;
e.name = name;
// 通知订阅者
Console.WriteLine("Student : Hello teacher, my name is " + name + " and my id is " + id);
this.Test.Invoke(this, e);
}
}
}
class Teacher
{
// 1.4 事件处理器
public void Listen(object sender, EventArgs e)
{
TestEventArgs args = e as TestEventArgs;
string res = "Teacher : Now i know " + "your id is " + args.id + " and your name is " + args.name;
Console.WriteLine(res);
}
}
}
不同之处如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具