C#有关事件的使用-进阶版
用猫和老鼠的示例
一、简单的情况,无参数订阅事件
//定义一个事件委托
public delegate void mcEventHandler();
//定义一个猫类
class Cat
{
string cName;
//定义一个猫叫事件
public event mcEventHandler CatCryEvent;
public Cat(string name)
{
cName = name;
}
//当猫叫时候,触发事件
public void Cry()
{
Console.WriteLine(cName+"来了");
Console.ReadLine();
//触发事件
CatCryEvent();
}
}
//定义一个鼠类
class Mouse
{
public string mName;
//在构造函数中进行订阅
public Mouse(Cat cat)
{
//订阅事件的两种形式
cat.CatCryEvent += Run;
cat.CatCryEvent += new mcEventHandler(See);
}
private void Run()
{
Console.WriteLine("猫来了,"+mName+"先走一步");
}
private void See()
{
Console.WriteLine("看看猫还在不在");
Console.ReadLine();
}
}
//主函数中实例化对象
class Program
{
static void Main(string[] args)
{
Cat cat1 = new Cat("Tom");
Mouse m1 = new Mouse(cat1);
//调用函数,以触发猫叫事件
cat1.Cry();
}
}
执行结果如下:
二、带有参数的事件订阅
首先定义一个传递参数的类,可以是EventArgs类的派生类(继承该类),也可以是string、int这种简单类,或者是其他自定义类型
这里定义一个CryEventArgs类传递参数
class CryEventArgs:EventArgs
{
//存储一个字符串
public string CatName
{
get;
set;
}
}
接下来设计Cat类和Mouse类
class Cat
{
string cName;
public event mcEventHandler CatCryEvent;
//定义带有参数的事件,此处CryEventArgs可以为其他简单类,如是,下面订阅的函数的签名需要相应地改变
public event EventHandler<CryEventArgs> CatCryEvent1;
public Cat(string name)
{
cName = name;
}
public void Cry()
{
Console.WriteLine(cName+"来了");
Console.ReadLine();
//用这个保存参数
CryEventArgs e = new CryEventArgs();
e.CatName = cName;
//触发事件
//CatCryEvent();
CatCryEvent1(this, e);
}
}
class Mouse
{
public Mouse(Cat cat)
{
//订阅事件的两种形式
//cat.CatCryEvent1 += Run;
cat.CatCryEvent1 += new EventHandler<CryEventArgs>(Run);
}
private void Run(object sender,CryEventArgs e)
{
if(e.CatName=="Tom")
{
Console.WriteLine("别怕,是Tom这只傻猫");
Console.ReadLine();
}
else
{
Console.WriteLine("快跑啊,是其他猫!");
Console.ReadLine();
}
}
}
//主函数,模拟事件发生
public static void Main()
{
Cat c1 = new Cat("Tom");
Cat c2 = new Cat("Ben");
//两只老鼠,分别见到两只猫
Mouse m = new Mouse(c1);
Mouse m2 = new Mouse(c2);
c1.Cry();
Console.WriteLine("//-----------------而另一边---------------------//");
c2.Cry();
}
结果如下图
“`