事件学习20240515

首先

明确关键字event在实例化委托时使用而非定义委托时使用。

委托定义与使用

        delegate void func();
        static func l;

事件定义与使用

        delegate void func();
        static event func l;

注意关键字的位置,在实例化的时候使用event;

事件需要与类结合起来,定义事件的类才可以调用事件。

    delegate void func();
    class Program
    {
        
        static void Main(string[] args)
        {
            Person.l();//这里报错Person.l”只能出现在 += 或 -= 的左边(从类型“Person”中使用时除外)
            Console.ReadKey();
        }
    }
    class Person{ 
    public static event func l;//这里定义事件
        void Action() {
        l();//这里没有报错因为这里在定义事件的类里。
        }
    }

 之前讲过,委托就像是一串鞭炮。将函数链接与取消或者触发,可以自由使用。但是事件限定了只能由声明事件的类来触发。而链接函数的过程,可以看做一种通知。这里写一个黑人抬棺的例子

using System;
using System.Data;
using System.IO;
namespace ConsoleApp3
{
    delegate void func(string name);
    class Program
    {

        static void Main(string[] args)
        {
            Person Hei1 = new Person("黑人小哥1");
            Person Hei2 = new Person("黑人小哥2");
            Person Hei3 = new Person("黑人小哥3");
            Person Hei4 = new Person("黑人小哥4");
            Person ming = new Person("小明");
            ming.died += Hei1.taiGuan;
            ming.died += Hei2.taiGuan;
            ming.died += Hei3.taiGuan;
            ming.died += Hei4.taiGuan;
            ming.fellFull += Hei1.seeFull;
            ming.fellFull += Hei2.seeFull;
            ming.fellFull += Hei3.seeFull;
            ming.fellFull += Hei4.seeFull;
            ming.fellHungry += Hei1.seeHungry;
            ming.fellHungry += Hei2.seeHungry;
            ming.fellHungry += Hei3.seeHungry;
            ming.fellHungry += Hei4.seeHungry;
            int i;

            try
            {
                while (true)
                {
                    Console.WriteLine("请输入小明吃甜甜圈的数量:");
                    i = int.Parse(Console.ReadLine());
                    ming.EatDonut(i);
                    Console.ReadKey();
                    Console.Clear();
                }
            }
            catch (Exception e)
            {

            }

        }
    }
    class Person
    {
        string name;
        public event func died;
        public event func fellFull;
        public event func fellHungry;
        public Person(string name)
        {
            this.name = name;
        }

        public void EatDonut(int i)
        {
            if (i <= 10)
            {
                fellHungry(name);
            }
            else
            {
                if (i <= 100)
                {
                    fellFull(name);
                }
                else
                {
                    if (i > 100)
                    {
                        died(name);
                    }
                }
            }
        }
        public void taiGuan(string name)
        {
            Console.WriteLine(this.name + "收到" + name + "死了,开始抬棺!奏乐!!");
        }
        public void seeHungry(string name)
        {
            Console.WriteLine(this.name + "看到" + name + "还很饿");
        }
        public void seeFull(string name)
        {
            Console.WriteLine(this.name + "看到" + name + "吃饱了");
        }
    }
}

 

利用+=注册事件以后,+=后面的函数何时触发,就由事件声明的主体来控制。因为我们都想知道这件事情发生以后,我们要预期什么效果。而声明类之外的函数,我们只能选择接受"+="或者拒绝接收"-=",我们无法清空"=",或者调用该事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值