.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);
}
}
}