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(); }结果如下图
“`