.Net事件机制
这几日太忙了,复习专业课,忙了几日其实也没认真看书,呵呵,下面再说一下事件,这个便是只要你真正理解了这个也就是委托的一种特例,是一种特殊的委托类型(也可以看作一个字段但是依旧返回的是委托类型,为什么呢,因为即便是string str ,str依旧是一个string类型 的参数),这个只要自己理解就不难了,问人根本解决不了问题和疑惑,昨日开始看时问了几个开发了几年的程序员一个问题,他们也是回答摸棱两可,最后没办法还是自己搞定了。
由于马上要上课去了,我只能在中午画了一个思维图和写的一个Demo给大家看一下我的思路,如有不同见解可以留言以便讨论。
示例如下:
using System;
namespace 事件研究
{
//包含事件的参数类
class WorkEventArgs : EventArgs
{
private string name;
private string position;
public string Name
{
get {return name; }
}
public string Position
{
get { return position;}
}
public string Info
{
get { return ("工作人员信息");}
}
public WorkEventArgs(string name, string position)
{
this.name = name;
this.position = position;
}
}
//定义一个委托
delegate void WorkEventHandler(object sender,WorkEventArgs e);
//包含事件的声明和触发事件的方法的类
class Work
{
private string name;
private string position;
public string Name
{
set { name = value; }
get { return name; }
}
public string Position
{
set { position = value; }
get { return position; }
}
//声明事件
public event WorkEventHandler InfoDisplay;
//触发事件的方法
protected virtual void OnWork(WorkEventArgs e)
{
if (InfoDisplay != null)
{
InfoDisplay(this, e);
}
}
//引发事件
public void DisWork()
{
WorkEventArgs e = new WorkEventArgs("","");//参数类只是让我们使用.net提供的委托方便而已
OnWork(e);
if (Name != null &&position!=null )
{
string s = string.Format("姓名:{0}\n职位:{1}", Name, Position);
Console.WriteLine(s);
}
//初始化一下事件的参数类并提取信息
WorkEventArgs c = new WorkEventArgs(Name,position);
Console.WriteLine("姓名:{0}\n职位:{1}", c.Name, c.Position);
}
}
//包含事件处理方法的类
class ResearchDepartment
{
//事件的处理方法
public void DisplayInfo(object sender, WorkEventArgs e)
{
Console.WriteLine(e.Info);
((Work)sender).Name = "小明";
((Work)sender).Position = "部门经理";
}
public void Display(object sender, WorkEventArgs e)
{
Console.WriteLine("后两条为初始化一下事件的参数类并提取信息!\n");
}
public void BookEvent(Work worker)
{
worker.InfoDisplay += new WorkEventHandler(Display);
worker.InfoDisplay += new WorkEventHandler(DisplayInfo);
}
void worker_InfoDisplay(object sender, WorkEventArgs e)
{
throw new NotImplementedException();
}
}
class TestEvent
{
public static void Main()
{
//初始化发行者
Work worker = new Work();
//初始化订阅者
ResearchDepartment rd = new ResearchDepartment();
//订阅事件(即把事件的处理方法绑定到发送者的委托实例上)
rd.BookEvent(worker);
worker.DisWork();
Console.ReadKey(true);
}
}
}
namespace 事件研究
{
//包含事件的参数类
class WorkEventArgs : EventArgs
{
private string name;
private string position;
public string Name
{
get {return name; }
}
public string Position
{
get { return position;}
}
public string Info
{
get { return ("工作人员信息");}
}
public WorkEventArgs(string name, string position)
{
this.name = name;
this.position = position;
}
}
//定义一个委托
delegate void WorkEventHandler(object sender,WorkEventArgs e);
//包含事件的声明和触发事件的方法的类
class Work
{
private string name;
private string position;
public string Name
{
set { name = value; }
get { return name; }
}
public string Position
{
set { position = value; }
get { return position; }
}
//声明事件
public event WorkEventHandler InfoDisplay;
//触发事件的方法
protected virtual void OnWork(WorkEventArgs e)
{
if (InfoDisplay != null)
{
InfoDisplay(this, e);
}
}
//引发事件
public void DisWork()
{
WorkEventArgs e = new WorkEventArgs("","");//参数类只是让我们使用.net提供的委托方便而已
OnWork(e);
if (Name != null &&position!=null )
{
string s = string.Format("姓名:{0}\n职位:{1}", Name, Position);
Console.WriteLine(s);
}
//初始化一下事件的参数类并提取信息
WorkEventArgs c = new WorkEventArgs(Name,position);
Console.WriteLine("姓名:{0}\n职位:{1}", c.Name, c.Position);
}
}
//包含事件处理方法的类
class ResearchDepartment
{
//事件的处理方法
public void DisplayInfo(object sender, WorkEventArgs e)
{
Console.WriteLine(e.Info);
((Work)sender).Name = "小明";
((Work)sender).Position = "部门经理";
}
public void Display(object sender, WorkEventArgs e)
{
Console.WriteLine("后两条为初始化一下事件的参数类并提取信息!\n");
}
public void BookEvent(Work worker)
{
worker.InfoDisplay += new WorkEventHandler(Display);
worker.InfoDisplay += new WorkEventHandler(DisplayInfo);
}
void worker_InfoDisplay(object sender, WorkEventArgs e)
{
throw new NotImplementedException();
}
}
class TestEvent
{
public static void Main()
{
//初始化发行者
Work worker = new Work();
//初始化订阅者
ResearchDepartment rd = new ResearchDepartment();
//订阅事件(即把事件的处理方法绑定到发送者的委托实例上)
rd.BookEvent(worker);
worker.DisWork();
Console.ReadKey(true);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?