zoukankan      html  css  js  c++  java
  • C# 自定义事件和委托(精彩转载)

    c# 自定义事件和委托

      事件是类和对象向外界发出的消息,事件的执行是通过事件委托的方式,调用我们所准备好的处理方法,而是先消息的响应的。要响应某些事件并针对某些事件执行我们意定的方法,需要做到以下几步:

            1、声明事件委托。

            2、声明事件。

            3、添加事件的触发方法。

            4、添加事件的处理程序(响应事件的方法)。

            5、将指定的事件处理程序邦定到要处理的事件上(订阅事件)。

            6、用户信息操作,并触发事件(调用事件的触发方法)。

            7、通过事件委托的回调,执行我们需要的事件处理程序。

          下面我们举一个简单的自定义事件处理程序的例子(控制台程序)

       namespace 事件
       {
        //发布事件的类
        public class TestEventSource
        {
            //定义事件参数类
            public class TestEventArgs : EventArgs
            {
                public readonly char KeyToRaiseEvent;
                public TestEventArgs(char keyToRaiseEvent)
                {
                    KeyToRaiseEvent = keyToRaiseEvent;
                }
            }

            //定义delegate
            public delegate void TestEventHandler(object sender, TestEventArgs e);
            //用event 关键字声明事件对象
            public event TestEventHandler TestEvent;

            //事件触发方法
            protected virtual void OnTestEvent(TestEventArgs e)
            {
                if (TestEvent != null)
                    TestEvent(this, e);
            }

            //引发事件
            public void RaiseEvent(char keyToRaiseEvent)
            {
                TestEventArgs e = new TestEventArgs(keyToRaiseEvent);
                OnTestEvent(e);
            }

        }
        //监听事件的类
        public class TestEventListener
        {
            //定义处理事件的方法,他与声明事件的delegate具有相同的参数和返回值类型
            public void KeyPressed(object sender, TestEventSource.TestEventArgs e)
            {
                Console.WriteLine("发送者:{0},所按得健为:{1}", sender, e.KeyToRaiseEvent);
            }

            //订阅事件
            public void Subscribe(TestEventSource evenSource)
            {
                evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
            }
            //取消订阅事件
            public void UnSubscribe(TestEventSource evenSource)
            {
                evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
            }
        }

        //测试类
        public class Test
        {
            public static void Main()
            {
                //创建事件源对象
                TestEventSource es = new TestEventSource();
                //创建监听对象
                TestEventListener el = new TestEventListener();
                //订阅事件
                Console.WriteLine("订阅事件\n");
                el.Subscribe(es);
                //引发事件
                Console.WriteLine("输入一个字符,再按enter键");
                string s = Console.ReadLine();
                es.RaiseEvent(s.ToCharArray()[0]);
                //取消订阅事件
                Console.WriteLine("\n取消订阅事件\n");
                el.UnSubscribe(es);

                //引发事件
                Console.WriteLine("输入一个字符,再按enter健");
                s = Console.ReadLine();
                es.RaiseEvent(s.ToCharArray()[0]);

     

            }
        }

    }

    程序执行结

    订阅事件

    输入一个字符,再按enter键
    aaaa
    发送者:事件.TestEventSource,所按得健为:a

    取消订阅事件

    输入一个字符,再按enter健

              TestEventSource类。他就相当于windows控件类一样,是事件的源,里面包含有事件的声明,以及存储调用参数的事件参数类,以及事件的触发方法。       

             TestEventListener类。他提供了事件处理程序,并实现了事件处理程序和事件对象的邦定,当然时间处理程序可以放在别处, 跟邦定程序(订阅事件)放在一起便于理解和调用

            Test 类,实例化自定义事件的事件源对象,并调用 TestEventListener类中的Subscribe(es);方法进行事件对象和事件处理程序的邦定(订阅事件),调用 TestEventSource类中的RaiseEvent(char keyToRaiseEvent)引发对象,并有对象所指定的委托回调处理事件。完成整个自定义事件。

               其中   RaiseEvent(char keyToRaiseEvent)      就相当于main()一样是自定义事件的执行入口,       从这个法开始---〉调用事件委托----〉查找订阅事件程序找到事件所封装的方法集----〉由委托回调事件处理程序并传递参数---〉执行事件处理程序。


    摘录自:http://www.cnblogs.com/huomm/archive/2007/12/04/982869.html

     

    浅析C#的事件处理和自定义事件 http://dev.csdn.net/develop/article/22/22951.shtm

     

    http://www.cnblogs.com/BeginnerClassroom/archive/2009/01/11/1373689.html

     

  • 相关阅读:
    idea maven install java: 程序包不存在
    Window10取消文件默认打开方式
    @ModelAttribute与@RequestBody的区别
    python小知识
    CentOS下yum方式安装FFmpeg
    推荐一款可以直接下载浏览器sources资源的Chrome插件
    如何在python中使用Elasticsearch
    python logging模块“另一个程序正在使用此文件,进程无法访问。”问题解决办法
    Python的伪造数据生成器:Faker
    docker修改系统时间总结
  • 原文地址:https://www.cnblogs.com/wuhenke/p/1623227.html
Copyright © 2011-2022 走看看