zoukankan      html  css  js  c++  java
  • .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

    希望对你有帮助~

  • 相关阅读:
    setBackgroundResource和setImageResource的区别
    startActivityForResult 请求码不正确
    startActivityForResult 请求码不正确
    startActivityForResult 请求码不正确
    svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法
    svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法
    svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法
    android stadio svn 使用技巧
    android stadio svn 使用技巧
    android stadio svn 使用技巧
  • 原文地址:https://www.cnblogs.com/DebugLZQ/p/2753076.html
Copyright © 2011-2022 走看看