欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

事件的简单运用小例子

程序员文章站 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();


        }
    }
}