事件的简单运用小例子

事件的本质就是委托,或者说是委托的一种应用,定义事件就是定义委托。只不过编译器隐藏了这个过程。那用事件实现的地方,用委托也完成可以实现,那为什么不直接使用委托呢?

对于维护对象状态的字段我们往往不设计为公开类型,因为外部完全可以随意改变它,这不是我们想看到的。例如上面那样写,我们可以在外部直接就调用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();


        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值