C#__事件event的简单使用:工具人下楼问题

// 工具人类

cs 复制代码
namespace DownStair
{
    delegate void DownStairDelegate(); // 定义了一个下楼委托
    class ToolMan
    {
        public string Name { get; set; } // 声明工具人的名字属性

        // public DownStairDelegate downStairDelegate = null; // 初始化委托downStair为空委托
        // 解决方案
        public event DownStairDelegate downStairDelegate = null; 

        public ToolMan(string name) // 构造函数获取工具人名字
        {
            Name = name;
        }
        public void DownStair() // 定义了一个方法:工具人下楼帮忙带东西
        {
            Console.WriteLine("工具人" + Name + "下楼了");

            //downStair(); // error,未将对象引用设置到对象的实例
            // 解决方案
            if (downStairDelegate != null)
            {
                downStairDelegate(); // 定义event后,只能在ToolMan类的内部触发
            }
        }


    }
}

// 懒人类

cs 复制代码
    class Lazyman
    {
        public string Name { get; set; }

        public Lazyman(string name)
        {
            Name = name;
        }

        public void TakeFood()
        {
            Console.WriteLine("给" + Name + "带盒饭");
        }
        public void TakePackage()
        {
            Console.WriteLine("给" + Name + "拿快递");
        }
        public void PrintFile()
        {
            Console.WriteLine("给" + Name + "打印文件");
        }
    }

// 调用运行

cs 复制代码
    // 事件(event):
    // 基于委托,是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托,事件的声明
    // 受限制的委托,只能施加 +=、-= 操作符,只允许add、remove方法操作
    // 不允许直接赋值,只能在类的内部触发 
    // 类似订阅和发布
    class Program
    {
        static void Main(string[] args)
        {
            // 工具人下楼问题
            // 创建对象
            ToolMan toolman = new ToolMan("大椿");
            Lazyman lazyman1 = new Lazyman("张三");
            Lazyman lazyman2 = new Lazyman("李四");
            Lazyman lazyman3 = new Lazyman("王五");

            toolman.DownStair(); 
            // 工具人大椿下楼了
            
            Console.WriteLine("========");

            toolman.downStairDelegate += lazyman1.TakeFood;
            toolman.downStairDelegate += lazyman1.TakePackage;
            toolman.downStairDelegate += lazyman2.TakePackage;
            toolman.downStairDelegate += lazyman3.PrintFile;
            toolman.DownStair();
            // 工具人大椿下楼了
            // 给张三带盒饭
            // 给张三拿快递
            // 给李四拿快递
            // 给王五打印文件

            Console.WriteLine("========");
            toolman.downStairDelegate -= lazyman1.TakePackage;
            toolman.DownStair();
            // 工具人大椿下楼了
            // 给张三带盒饭
            // 给李四拿快递
            // 给王五打印文件


             出现问题
            //Console.WriteLine("========");
            //toolman.downStairDelegate = lazyman1.TakeFood; // 直接赋值后其他对象全部消失
            //toolman.DownStair();
            工具人大椿下楼了
            给张三带盒饭

            //Console.WriteLine("========");
            //toolman.downStairDelegate(); // 可直接调用downStairDelegate(),此时张三未下楼。
             给张三带盒饭

            // 解决办法:使用event事件
        }
    }
相关推荐
阿里嘎多学长18 小时前
2026-04-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
叶小鸡20 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手20 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
时空系21 小时前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
CHANG_THE_WORLD1 天前
python 批量终止进程exe
开发语言·python
古城小栈1 天前
从 cargo-whero 库中,找到提升 rust 的契机
开发语言·后端·rust
Gary Studio1 天前
安卓HAL C++基础-智能指针
开发语言·c++
啧不应该啊1 天前
Day1 Python 与 C 的类型区别
c语言·开发语言
cen__y1 天前
Linux07(信号01)
linux·运维·服务器·c语言·开发语言
xingpanvip1 天前
星盘接口开发文档:星相日历接口指南
android·开发语言·前端·css·php·lua