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

来源:互联网 发布:pdf文档解密软件 编辑:程序博客网 时间:2024/04/27 13:31
我们建一个控制台程序。

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

 

原创粉丝点击