zoukankan      html  css  js  c++  java
  • [转] 自定义事件

    DebugLZQ 原文.NET自定义事件小结

    关于事件各位应该都不陌生,相信每个程序员都可以拍着胸脯说“事件?我知道啊~”,可如何自定义事件?也许有人心中就不是那么底气十足了。

    用很多地方都被引用到泛滥的一个例子来写吧,始作俑者就不去深究了。描述是这样的:小偷进入时,事件发送者(狗)发送狗叫事件(自定义),(事件接收者)主人订阅狗叫事件并处理(抓住小偷),事件的参数传递的是小偷的数量。下面就给出实现的具体步骤---已经在代码注释中标明,以供各位博友抽象出自定义事件的流程。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 自定义事件
    {
        //http://www.cnblogs.com/DebugLZQ
        //自定义事件步骤的示例代码
    
        //0.定义事件传递的参数
        class AlarmEventArgs : EventArgs
        {
            public  int numberOfThief;
            public AlarmEventArgs(int n)
            {
                numberOfThief = n;
            }
        }
        //事件的发出者
        class Dog
        {
            //1.声明事件的委托
            public delegate void AlarmEventHandler(Object sender, AlarmEventArgs e);
            //2.声明事件
            public event AlarmEventHandler Alarm;
            //3.引发事件的函数
            public void OnAlarm(AlarmEventArgs e)
            {
                if (this.Alarm != null)
                {
                    Console.WriteLine("The dog is Wangwang...");
                    this.Alarm(this, e);                
                }
            }
        }
        //事件的订阅者
        class Host
        {
            //4.订阅事件
            public Host(Dog dog)
            {
                dog.Alarm += new Dog.AlarmEventHandler(HostHandleEvent);
            }
            //5.事件处理程序
            public void HostHandleEvent(Object sender, AlarmEventArgs e)
            {
                Console.WriteLine("Host caught the thief! The sum is "+e.numberOfThief);
            }
        }
        
        class Program
        {
            static void Main(string[] args)
            {
                
                Console.WriteLine("Program is running...");
    
                Dog dog = new Dog();
                Host host = new Host(dog);
    
                Console.WriteLine("Someone is coming...");
                //6.在合适的时候引发事件
                AlarmEventArgs alarmEventArgs = new AlarmEventArgs(3);
                dog.OnAlarm(alarmEventArgs);
    
                Console.ReadKey();
            }
        }
    }
    

    程序运行结果如下:

    例子很简单,我是按照顺序写的,在代码中也有详细的步骤注释,就不多讲了。一般经验来讲,自定义的东西往往是很有用的,而往往也不是人人能够掌 握,DebugLZQ总结了一下,也没有什么高端的技术,遇到了自定义事件的这个事情,写下来吧,心里也就不虚了~具体流程可能一千个人一千个哈姆雷特, 看个人习惯~

    本文自定义的CLR事件,关于自定义WPF的路由事件请参考:WPF 自定义路由事件

    接下来英语口语要注意锻炼,技术要继续学习(重点是加强LINQ,WCF,WPF以及敏捷开发方面的知识),努力提高自己的专业素质,在此期间完成毕业论文。

    时间又是很晚了~手指在键盘上流浪至天明吧~多么美丽的夜晚---So Beautiful ! 

    =====================================================

    Update:

    我们可以使用.NET提供的EventHandler<TEventArgs> delegate来简化,事件的定义及使用,提高开发效率和代码质量~

    如下(区别在步骤2和4,省略了1):

    using System;
    
    namespace RefactorCustomizeEventDemo
    {
        //http://www.cnblogs.com/DebugLZQ
        //自定义事件步骤的示例代码
    
        //0.定义事件传递的参数
        class AlarmEventArgs : EventArgs
        {
            public int numberOfThief;
            public AlarmEventArgs(int n)
            {
                numberOfThief = n;
            }
        }
        //事件的发出者
        class Dog
        {
    
            //2.声明事件
            public event EventHandler<AlarmEventArgs> Alarm;
            //3.引发事件的函数
            public void OnAlarm(AlarmEventArgs e)
            {
                if (Alarm != null)
                {
                    Console.WriteLine("The dog is Wangwang...");
                    Alarm(this, e);
                }
            }
        }
        //事件的订阅者
        class Host
        {
            //4.订阅事件
            public Host(Dog dog)
            {
                // dog.Alarm += new EventHandler<AlarmEventArgs>(HostHandleEvent); // this line is equal to the next line
                dog.Alarm += HostHandleEvent;
            }
            //5.事件处理程序
            public void HostHandleEvent(Object sender, AlarmEventArgs e)
            {
                Console.WriteLine("Host caught the thief! The sum is " + e.numberOfThief);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
    
                Console.WriteLine("Program is running...");
    
                Dog dog = new Dog();
                Host host = new Host(dog);
    
                Console.WriteLine("Someone is coming...");
                //6.在合适的时候引发事件
                AlarmEventArgs alarmEventArgs = new AlarmEventArgs(3);
                dog.OnAlarm(alarmEventArgs);
    
                Console.ReadKey();
            }
        }
    
    }
    

    步骤2:申明事件的最佳实践如下:

    //2.声明事件
    public event EventHandler<AlarmEventArgs> Alarm= delegate { };

    程序运行如下:

    Update:

    请参考DebugLZQ后续博文:

    WPF 4.5 New Feature:Using the WeakEvent pattern with WeakEventManager to avoid memory leaking

    [C#] A simple implementation of the WeakEvent pattern

  • 相关阅读:
    mongodb
    python中读取文件的read、readline、readlines方法区别
    uva 129 Krypton Factor
    hdu 4734
    hdu 5182 PM2.5
    hdu 5179 beautiful number
    hdu 5178 pairs
    hdu 5176 The Experience of Love
    hdu 5175 Misaki's Kiss again
    hdu 5174 Ferries Wheel
  • 原文地址:https://www.cnblogs.com/arxive/p/5844498.html
Copyright © 2011-2022 走看看