事件其实很简单,当然是在了解了之后。定义就不说了,可以理解为一种特殊的、进阶的委托。相信大家都用过winform里面的事件,比如Button的Click事件,当我们单击按钮的时候,触发事件,执行相关的操作。
例子也很简单,员工A每次玩手机的时候,都会被员工B数落一通。我们定义了两个类,员工A,员工B
class I
{
string name;
public I(string name)
{
this.name = name;
}
public void PlayPhone()
{
Console.WriteLine("员工A玩手机了。。。。");
Console.WriteLine("可是当他刚打开手机屏幕的时候,");
//如果有人订阅了该事件,则执行该事件
if (PlayPhoneEvent!=null)
{
PlayPhoneEvent();
}
}
//声明一个委托
public delegate void PlayPhoneEventHandler();
//声明一个事件,注意事件是声明在发布者的类中
public event PlayPhoneEventHandler PlayPhoneEvent;
class SomeBody
{
string name;
public SomeBody(string name)
{
this.name = name;
}
public void Shout()
{
Console.WriteLine(name+"说:"+"怎么你一天到晚都在玩手机!?");
}
}
调用:
static void Main(string[] args)
{
I i = new I("衰仔");
SomeBody someBody = new SomeBody("偷偷看你的人");
//i.PlayPhoneEvent += new PlayPhoneEventHandler (someBody.Shout);
//上面的是C#1中的老式写法,下面的是新的写法:方法组转换?
i.PlayPhoneEvent += someBody.Shout;
i.PlayPhone();
Console.ReadLine();
}
下面是执行结果:
在设计模式中,有一种模式叫做观察者模式,其实就是我们所说的事件。类I就相关于发布者,SomeBody就相当于是观察者或者叫订阅者。
我们见到的事件,都是含参数的,比如Button的Click事件:
private void Button1_Click(object sender, EventArgs e)
其中,参数sender类型是sender,表示发送消息的对象(发布者,在本例中,是指类I);
参数e类型是EventArgs,可以用作基类让其他类继承,用来传递一些额外的信息。
现在继续拿上面的例子,加入这两个参数,看看如何使用这两个参数。
class I
{
string name;
public I(string name)
{
this.name = name;
}
public void PlayPhone()
{
Console.WriteLine("员工A玩手机了。。。。");
Console.WriteLine("可是当他刚打开手机屏幕的时候,");
//如果有人订阅了该事件,则执行该事件
//加入了参数以后,类I以及它的name字段通过该事件被传递给了订阅事件的人
if (PlayPhoneEvent!=null)
{
EventArgs e = new MyEventArgs() { Name=this.name};
PlayPhoneEvent(this,e);
}
}
//声明一个委托
public delegate void PlayPhoneEventHandler(object sender,EventArgs e);
//声明一个事件,注意事件是声明在发布者的类中
public event PlayPhoneEventHandler PlayPhoneEvent;
}
class SomeBody
{
string name;
public SomeBody(string name)
{
this.name = name;
}
public void Shout(object sender, EventArgs e)
{
MyEventArgs args = e as MyEventArgs;
//使用到了e参数:
Console.WriteLine(name+"说:"+ args.Name+",怎么你一天到晚都在玩手机!?");
}
}
新增了一个类MyEventArgs,继承自EventArgs,用来传参:
class MyEventArgs:EventArgs
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
调用:
static void Main(string[] args)
{
I i = new I("衰仔");
SomeBody someBody = new SomeBody("偷偷看你的人");
i.PlayPhoneEvent += someBody.Shout;
i.PlayPhone();
Console.ReadLine();
}