委托、事件、事件访问器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 委托与事件
{
public class MaiPiaoEventArgs : EventArgs //自定义事件数据类
{
public string diFang;
public double money;
//构造函数
public MaiPiaoEventArgs(string diFang, int money)
{
this.diFang = diFang;
this.money = money;
}
}
public class Publisher //发行者
{
public delegate void MaiPiaoEventHandler(object sender, MaiPiaoEventArgs e); //事件委托
private int money; //私有字段
public Publisher(int x) //构造函数
{
this.money = x;
}
public event MaiPiaoEventHandler MaiPiaoEvent1; //类似字段的公共事件。MaiPiaoEvent1、maiPiaoEvent2就是一个委托类型的变量。
private event MaiPiaoEventHandler maiPiaoEvent2; //类似字段的私有事件。类似属性的私有字段,在这里是私有事件。
public event MaiPiaoEventHandler MaiPiaoEvent2 //类似属性的公共事件,包含访问器(事件访问器)。好比属性访问器。
{
add //事件添加访问器
{
lock (this) //锁定事件的包含对象。this用于实例事件;对于静态事件,用typeof(类名)替换this
{
if (money > 20)
{
maiPiaoEvent2 += new MaiPiaoEventHandler(value);
Console.WriteLine("MaiPiaoEvent2说:“钱足够,可以买车票了”。\n");
}
else
{
Console.WriteLine("MaiPiaoEvent2说:“钱不够,车票买不成了”。\n");
}
}
}
remove //事件移除访问器
{
lock (this)
{
maiPiaoEvent2 -= new MaiPiaoEventHandler(value);
Console.WriteLine("MaiPiaoEvent2说:“已从待办事项中取消买车票的计划”。\n");
}
}
}
protected virtual void OnMaiPiaoEvent1(MaiPiaoEventArgs e)
{
if (MaiPiaoEvent1 != null)
{
MaiPiaoEvent1(this, e);
}
}
protected virtual void OnMaiPiaoEvent2(MaiPiaoEventArgs e)
{
if (maiPiaoEvent2 != null)
{
maiPiaoEvent2(this, e);
}
}
public void Start(string diFang, int money)
{
MaiPiaoEventArgs MaiPiao = new MaiPiaoEventArgs(diFang, money);
this.OnMaiPiaoEvent2(MaiPiao);
this.OnMaiPiaoEvent1(MaiPiao);
}
}
class Program
{
static void MrMing(object sender, MaiPiaoEventArgs e)
{
if (e.money < 20)
{
Console.WriteLine("Mr.Ming说:“20块都不到,能买{0}的车票?你自己去,我买不到!”\n", e.diFang);
}
else
{
Console.WriteLine("Mr.Ming说:“好的,马上去买。省下的钱全当劳务费了哦!”\n");
}
}
static void MrZhang(object sender, MaiPiaoEventArgs e)
{
Console.WriteLine("Mr.Zhang说:“{0}块钱让我去买{1}的票,不够啊。害我白跑,NND!”\n", e.money, e.diFang);
}
static void Main(string[] args)
{
Console.WriteLine("事件访问器应用示例之买车票");
Publisher Pub1 = new Publisher(25); //创建发行者对象
//订阅事件,均获得成功
Pub1.MaiPiaoEvent1 += new Publisher.MaiPiaoEventHandler(MrZhang);
Pub1.MaiPiaoEvent2 += new Publisher.MaiPiaoEventHandler(MrMing);
Pub1.Start("上海",25);
Console.WriteLine("--------------------------------------------------------");
Publisher Pub2 = new Publisher(19); //创建发行者对象
//订阅事件,MaiPiaoEvent2未成功订阅事件
Pub2.MaiPiaoEvent1 += new Publisher.MaiPiaoEventHandler(MrZhang);
Pub2.MaiPiaoEvent2 += new Publisher.MaiPiaoEventHandler(MrMing);
Pub2.Start("上海", 19);
Console.WriteLine("--------------------------------------------------------");
//取消订阅事件
Pub2.MaiPiaoEvent1 -= new Publisher.MaiPiaoEventHandler(MrZhang);
Pub2.MaiPiaoEvent2 -= new Publisher.MaiPiaoEventHandler(MrMing);
Pub2.Start("上海", 25);
Console.ReadKey();
}
}
}