事件

前言
  • 委托类型的变量可以作为类的成员,也可以作为方法的局部变量
  • public event MyDelegate myDelegate
  • 在一个委托类型的变量前面加上event,就声明了一个事件
盲点
  • 事件和委托同时在Test类里面被声明为public
  • 但是事件的调用只能在Test类中,在该类外面就只能+=或者-=
  • 而委托则可以在任何类中进行调用
区别点
  • 事件只能作为类的成员被声明
  • 由于事件不是类型,我们不能使用对象创建表达式来创建它的对象
  • 由于是成员,必须声明在类或结构中
  • 不能在一段可执行代码中声明事件
  • 事件成员被隐式自动初始化为null
发布者类——猫
// 发布者类
class Cat
    {

        private string color;
        private string name;

        public Cat(string color, string name)
        {
            this.name = name;
            this.color = color;
        }

        public void CatComing()
        {
            Console.WriteLine("{0}的猫咪{1}进来了", color, name);
            runEvent();
        }

        private event Action runEvent; //我不想把事件暴露出去
	    //public static event Action runEvent; //也可以设置成静态成员
        public void AddRun(Action method) //提供一个方法添加事件
        {
            runEvent += method;
        }
    }
订阅者类——老鼠
 // 订阅者类
 class Mouse
    {
        private string name;

        public Mouse(string name)
        {
            this.name = name;
        }

        public void Run()
        {
            Console.WriteLine("老鼠{0}正在逃跑中....",name);
        }
    }
触发事件
 class Program
    {
        static void Main(string[] args)
        {
            //Mouse 属于订阅者类
            Mouse mouse1 = new Mouse("吉米");
            Mouse mouse2 = new Mouse("大黑");
            Mouse mouse3 = new Mouse("小绿");

            //猫属于发布者类
            Cat cat = new Cat("花色", "小喵");
            cat.AddRun(mouse1.Run);
            cat.AddRun(mouse2.Run);
            cat.AddRun(mouse3.Run);

            //当猫进来的时候,触发事件,老鼠逃跑
            cat.CatComing();
           
            //cat.runEvent(); 
            Console.ReadKey();
        }
      
    }
  • 注意事件只能出现在+=,-=的左边,在发布者类外部无法作为方法调用
  • 但是委托可以,不过尽量不要使用,以免出错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值