从发布者和订阅者来看事件

一个事件代码,只需要记住5个部分即可,如图所示:

1.声明委托:事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型进行描述。

2.声明事件:发布者类必须声明一个订阅者类可以注册的事件成员。

3.触发事件:发布者类中触发事件,便会调用注册在事件上的所有事件处理程序。

4.注册事件:订阅者必须订阅事件才能在事件被触发时得到通知。

5.处理事件:订阅者会在事件发生后执行相应的处理程序。

一、猫和老鼠的例子(不传递数据)

代码如下:

using System;
namespace 练习专用
{
//声明委托
public delegate void MyDel();

//发布者类-猫
class Cat
{
//声明事件
public event MyDel CatCryEvent;
//在猫叫的方法中触发事件
public void Cry()
{
Console.WriteLine("有只猫在叫。。。");
//触发事件
CatCryEvent();
}
}

//订阅者类-老鼠
class Mouse
{
public Mouse(Cat cat)
{
//注册事件,订阅者老鼠向事件添加事件处理程序
cat.CatCryEvent += Run;
}
//处理事件,事件发生后的处理程序
void Run()
{
Console.WriteLine("老鼠快跑吧!!!");
}
}
class Program
{
static void Main(string[] args)
{
Cat cat1 = new Cat();
Mouse mouse1 = new Mouse(cat1);
cat1.Cry();
}
}
}

二、猫和老鼠的例子(传递数据)

可以使用System命名空间提供的EventHandler委托类型,所以不需要自己定义委托类型了,它是这么定义的:

public delegate void EventHandler(object sender, EventArgs e);
//第一个参数用来保存触发事件的对象的引用。由于是object类,所以可以匹配任何类型的实例
//第二个参数用来保存状态信息,指明什么类型适用于该应用程序
为了向事件处理程序的第二个参数传入数据,需要声明一个派生自EventArgs的自定义类来保存需要传入的数据。
代码如下:

using System;
namespace 练习专用
{
//自定义一个派生自EventArgs的类,保存数据
class CryEventArgs : EventArgs
{
//存储一个字符串
public string CatName
{
get;
set;
}
}

//发布者类-猫
class Cat
{
public string CatName
{
get;
set;
}
//构造函数,给猫弄个名字
public Cat(string name)
{
this.CatName = name;
}
//声明事件,使用自定义类的泛型委托
public static event EventHandler<CryEventArgs> CatCryEvent;
//在猫叫的方法中触发事件
public void Cry()
{
Console.WriteLine("有只猫在叫。。。");
//把猫的名字保存到刚才的自定义类中
CryEventArgs e = new CryEventArgs();
e.CatName = this.CatName;
//触发事件,传递参数
CatCryEvent(this, e);
}
}

//订阅者类-老鼠
class Mouse
{
public Mouse()
{
//注册事件,订阅者老鼠向事件添加事件处理程序
Cat.CatCryEvent += Run;
}
//处理事件,事件发生后的处理程序
void Run(object sender, CryEventArgs e)
{
if (e.CatName == "黑猫警长")
{
Console.WriteLine("是黑猫警长,老鼠快特么的跑吧!!!");
}
else
{
Console.WriteLine("不是黑猫警长,是{0},老鼠不用跑了。。。", e.CatName);
}
}
}
class Program
{
static void Main(string[] args)
{
Cat cat1 = new Cat("黑猫警长");
Cat cat2 = new Cat("小猫咪");
Mouse mouse = new Mouse();
cat1.Cry();
Console.WriteLine("===============手动分割线===============");
cat2.Cry();
}
}
}

---------------------
作者:CRonaldo9399
来源:CSDN
原文:https://blog.csdn.net/sinat_32832727/article/details/54800920
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/asdyzh/p/9985539.html