namespace EventDemo
{
public delegate void DeleBark();//声明委托
class Program
{
static void Main(string[] args)//主函数
{
Dog d1 = new Dog();
d1.OnBark += Listen_Bark;
d1.Bark();//狗叫触发了OnBark“事件”,执行了方法d1_Bark
d1.OnBark();//欺骗 实际狗没有叫,没有调d1.Bark()方法;
Dog2 d2 = new Dog2();
d2.AddBark(Listen_Bark);
d2.Bark();
//无法访问到d2的OnBark()安全了!
Dog3 d3 = new Dog3();
d3.OnBark+=Listen_Bark;//为事件注册响应方法
d3.Bark();//内部触发OnBark事件,执行Listen_Bark方法
Console.ReadKey();
}
public static void Listen_Bark()
{
Console.WriteLine("狗叫了!");
}
}
//1、纯委托类型版“事件”,不安全
class Dog
{
public void Bark()
{
if (OnBark!=null)
{
OnBark();//委托的调用,依赖于Bark(),即监听了Bark()
}
}
public DeleBark OnBark;//Dog的委托类型成员--“事件”
}
//2、私有委托类型的“事件”,安全可控
OnBark定义为private 的,外界不可直接访问和调用。
增加公共方法AddOnBark和RemoveBark,让外界为这个委托添加或移除方法
class Dog
{
public void Bark()
{
if (OnBark != null)
{
OnBark();//委托的调用,依赖于Bark(),即监听了Bark()
}
}
private DelBark OnBark;//Dog的委托类型的私有成员--“事件”
//给“事件”注册方法
public void AddBark(DeleBark dele)
{
OnBark += dele;
}
//给“事件”注销方法
public void RemoveBark(DeleBark dele)
{
OnBark -= dele;
}
}
//3、真实的事件:public的事件相当于:一个私有的委托成员 加上公开的Add和Remove两个方法
// 将事件成员被设置为public的event修饰的成员。
// 封装Add方法和Remove方法,外界可通过“+=”和“-=”为期注册和注销事件响应方法。
// 由于是event修饰的,只允许内部调用,外界不能调用了。
class Dog
{
public void Bark()
{
if (OnBark != null)
{
OnBark();//事件的触发,依赖于Bark(),即监听了Bark()
}
}
public event DelBark OnBark;//定义事件,用原来语言上再加event关键字修饰
}
}