C#事件-换一个角度理解委托和事件

本文通过对比分析,展示了如何利用C#中的委托和事件来简化按钮点击事件的处理过程,避免代码冗余并提高灵活性。
我们建一个控制台程序。

未使用委托、事件之前的代码
using System;
class Program
    {
        static void Main(string[] args)
        {
            //实例化一个button类
            Button btn = new Button();
            btn.Click();
        }
    }

    //首先要定义一个Button类,里面应该有一个Click方法
    public class Button
    {
        //Click方法调用固定的方法
        public void Click()
        {
            ForCustome fc = new ForCustome();
            fc.Button_Click();
        }
    }
    //上面这个类是封装了的,用户不可见,或者理解为用户不能更

改也可以

    //下面这个类提供给用户
    public class ForCustome
    {
        public void Button_Click()
        {
            //用户在这里写具体的方法实现
            Console.WriteLine("被点击了!");
        }

    }

可以看出,以上的代码实现一个按钮是可行的,但两个按钮就麻烦了。不到黄河心不甘,我们硬着头皮再写两个按钮的情况吧。
using System;
    class Program
    {
        static void Main(string[] args)
        {
            //实例化一个button类
            Button btn = new Button();
            btn.Click();

            //实例化第二个button
            Button btn2 = new Button();
            btn2.Click();   //这样写能行么?我们发现,这样写根本不行!
        }
    }

    //首先要定义一个Button类,里面应该有一个Click方法
    public class Button
    {
        //Click方法调用固定的方法
        public void Click()
        {
            ForCustome fc = new ForCustome();
            fc.Button_Click();

            //很想在这里面改呀,添一个方法调用
            fc.Button2_Click();     //要是再有一段条件判断的逻辑就更好了,是吧?
        }
    }
    //上面这个类是封装了的,用户不可见,或者理解为用户不能更改也可以

    //下面这个类提供给用户
    public class ForCustome
    {
        public void Button_Click()
        {
            //用户在这里写具体的方法实现
            Console.WriteLine("被点击了!");
        }

        //添一个方法实现是必须的
        public void Button2_Click()
        {
            Console.WriteLine("我是第二个被点击的按钮!");
        }
    }
如果你是自己在试着写的话,估计你已经崩溃了,这样实现太难了!

好了,看看微软是如何解决这个问题的吧。
using System;
    //先声明一个委托再说,目标是要能调用ForCustome类里的方法,所以注意方法签名
    public delegate void myDelegate();
 
    public class Button
    {
        //声明一个事件,和委托相关联
        public event myDelegate ClickIt;
       
        public void Click()
        {
            //可以想象,这个方法是一个封装了之前我们想要的一大段条件判断语句的“复合体”
            ClickIt();
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            ForCustome fc = new ForCustome();

            //实例化一个button类
            Button btn = new Button();
            //这里,将按钮的事件和按钮事件对应的(将要触发的)方法相关联,相当于我们之前想象的注册
            btn.ClickIt += new myDelegate(fc.Button_Click);
            btn.Click();

            //实例化第二个button
            Button btn2 = new Button();
            btn2.ClickIt+=new myDelegate(fc.Button2_Click);
            btn2.Click();   //这样写能行么?
        }
    }

    //这个类提供给用户的,没有变化
    public class ForCustome
    {
        public void Button_Click()
        {
            //用户在这里写具体的方法实现
            Console.WriteLine("被点击了!");
        }

        //添一个方法实现是必须的
        public void Button2_Click()
        {
            Console.WriteLine("我是第二个被点击的按钮!");
        }
    }

消息 优快云首页 发布文章 【数据驱动】【航空航天结构的高效损伤检测技术】一种数据驱动的结构健康监测(SHM)方法,用于进行原位评估结构健康状态,即损伤位置程度,在其中利用了选定位置的引导式兰姆波响应(Matlab代码实现) 99 100 摘要:会在推荐、列表等场景外露,帮助读者快速了解内容,支持一键将正文前 256 字符键入摘要文本框 0 256 AI提取摘要 您已同意GitCode 用户协议 隐私政策,我们会为您自动创建账号并备份文章至我的项目。 活动 话题 共 0 字 意见反馈内容概要:本文研究了在湍流天气条件下,无人机发生发动机故障时的自动着陆问题,提出了一种多级适配控制策略,并通过Matlab进行仿真代码实现。该策略旨在提升无人机在极端环境下的安全着陆能力,重点解决了气流干扰与动力失效双重挑战下的姿态稳定与轨迹规划问题。研究涵盖了故障检测、控制系统重构、自适应调整及安全着陆路径生成等关键技术环节,验证了所提方法在复杂气象条件下的有效性与鲁棒性。; 适合人群:具备一定无人机控制、自动控制理论基础及Matlab编程能力的科研人员、研究生以及从事航空航天、智能控制领域的工程技术人员。; 使用场景及目标:①用于无人机故障应急控制系统的设计与仿真;②支持复杂环境下无人机动态响应分析与控制算法开发;③为飞行器自主安全着陆技术提供解决方案参考。; 阅读建议:建议结合Matlab代码与控制理论深入理解多级适配机制,重点关注故障识别与控制切逻辑,可通过修改仿真参数测试不同湍流强度下的系统表现,以加深对算法鲁棒性的认识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值