事件的简单运用小例子
程序员文章站
2022-04-08 17:09:11
...
事件的本质就是委托,或者说是委托的一种应用,定义事件就是定义委托。只不过编译器隐藏了这个过程。那用事件实现的地方,用委托也完成可以实现,那为什么不直接使用委托呢?
对于维护对象状态的字段我们往往不设计为公开类型,因为外部完全可以随意改变它,这不是我们想看到的。例如上面那样写,我们可以在外部直接就调用NewMail的Invoke方法。而且对于字段,我们无法控制具体的获取和设置过程,要控制就需要定义一个Get_ 方法,一个Set_方法,对于委托类型来说,就是Add_和Remove_。对于每个事件,都去定义Add_/Remove_是非常麻烦的。说到这里我们会马上连想到属性的设计,没错,属性是用Get_/Set_方法提供访问私有字段(非委托)的方法,事件就是用Add_/Remove_方法提供访问私有委托字段的方法。
至此我们应该知道:委托的本质是引用类型,用于包装回调函数,委托用于实现回调机制;事件的本质是委托,事件是回调机制的一种应用。
首先 创建三个类,分别是 cat mouse human ;要实现的内容就是输入 一段 “”猫叫了一声,老鼠跑了,人醒了“”;
cat类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventAndDeletegate
{
public class Cat
{
public delegate void YellHandler();//声明一个委托
public static event YellHandler CatYellHandler;//声明一个YellHandler的事件 事件是一个委托的实例
//1什么是事件:就是一个委托的实例对象
//特点:1不能赋值 2事件不能在外部调用
//目的:安全性高 只允许内部的行为
public static void CatYell()
{
Console.WriteLine("小猫叫了一声,瞄~");
//Mouse.MouseYell();
//Human.HumanYell();
}
public static void Say()
{
if (CatYellHandler !=null)//如果事件里面不为空 执行
{
CatYellHandler.Invoke();
}
}
}
}
mouse 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventAndDeletegate
{
public class Mouse
{
public static void MouseYell()
{
Console.WriteLine("老鼠被吓跑了,打翻了瓶子");
}
}
}
human 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventAndDeletegate
{
public class Human
{
public static void HumanYell()
{
Console.WriteLine("瓶子被打翻了,人被吵醒了");
}
}
}
主程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventAndDeletegate
{
class Program
{
static void Main(string[] args)
{
//Cat cat = new Cat();
//cat.CatYell();
//Console.Read();
Cat.CatYellHandler += Cat.CatYell;
Cat.CatYellHandler += Mouse.MouseYell;
Cat.CatYellHandler += Human.HumanYell;
Cat.Say();
Console.Read();
}
}
}
上一篇: mybatis 批量插入简单的小例子
下一篇: Java读取txt文件