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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们建一个控制台程序。

未使用委托、事件之前的代码
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("我是第二个被点击的按钮!");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值