• .NET事件机制之多播委托


    很长一段时间都纠结在.NET事件处理机制上,看了不少例子,也不知道太过抽象,还是自己理解能力不够,总是一头雾水,周末时间,又重新拾起以前没有弄明白的事件处理机制,看了思胜的.NET事件处理机制,恍然大悟,现在把学到的东西分享出来,也是对自己学习的一个巩固,曾经总是以为写日志就是耽误时间,需要花大量的时间组织语句,然后在花大量的时间把学到的东西一个字一个字的敲出来。但是现在随着自己开发项目经验的积累,技术的提升,意识到写日志,记录自己的学习过程是一个很重要的环节。努力学习编程技能的同时,也要偶尔停下来,有一句说的好:在你努力学习知识的时候,别忘了适当的时候停下来,知识也需要沉淀!。同时告诫自己,以后要养成写日志的习惯。下面就分享下自己理解的.NET事件机制。
          简单的例子一:
           中国轰炸小日本
           1、从生活的角度来说:算一次事件吗?答:是一次事件。
           2、这件事情发生在哪里?答:发生在小日本——.NET中的事件源,事件发生的地方。
           3、从编程的角度灵活的的描述这个事件
                        答:(*******)国轰炸了(******)国
           4、轰炸这件事件,我们是怎么知道的?答:电视、报纸、广播、网络、书籍、谣传等等 ——委托
           5、接收方式:电视直播、电视录播、摄影拍摄、报纸书写。
           6、为什么直播最被认可:不会造假。——委托从事件源接受信息并传递,委托充当了信息的传递者。
           7、其他接收方式,如录播等等——可以无需事件源,直接向一系列接受者发送信息,委托充当了信息的生成者。


          简单的例子二:
           一位美女在文本框textbox中按下了键盘中的按键——KeyPress事件发生
           1、 事件源实体:文本框textbox
           2
     事件源类型:System.Window.Forms.Textbox
           
          回到.NET
          从以上的例子中得到以下信息:
           1、事件源EventSource:内部包含事件作为其成员,与方法、属性同等级别,表达可能产生事件的数据实体。
           2、在代码中描述一个事件时,其描述手段必须通过类型来进行,而不能将具体的实体设想为必然的事件源。
           3、在事件源归属类型中,内部必须包含事件作为其成员,且事件成员可以为静态成员或实例成员。
           4、静态事件只有一份,归属于本类型,实例事件在每一个实例上都有一份,归属于每一个实例。
         事件用到的类型:委托
          委托:Delegate,主要有两种方法。
           1、委托可以直接控制若干项方法,称为绑定若干方法,通过触发委托来调用其内部可控的方法。
           2、委托可以与事件源绑定,产生注册关系,一旦事件源触发事件,其事件相关信息会自动传递给委托实例,委托实例则会继续将
               事件信息自动顺序发送给内部绑定的一系列方法。

    实例:通过委托来调用其内部可控方法

    /*
     *   
    作者:上官风
     *    目标:制作简易小程序,表达完全由委托来直接调用多个方法,本程序未遵守.NET标准的事件委托模型编程方案
    */
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        //
    对外传递信息,表达attackerdefender发起了战争攻击
        public delegate void TellBattleInfo(string attacker, string defender);
        class Program
        {
            static void Main(string[] args)
            {
                TellBattleInfo a = new TellBattleInfo(ChinaDoWork); //
    中国人开始看电视
                a += JapDoWork;                                     //小日本开始看电视
                a += NuetralDoWork;                                 //中立者开始看电视

                //电视台开始播放电视
                a("中国","小日本");
                Console.ReadLine();
            }

            private static void ChinaDoWork(string attacker, string defender)
            {
                if (attacker == "
    中国")
                {
                    Console.WriteLine("
    作为中国公民,只要去打小日本,我们一起去!!");
                }
                else
                {
                    Console.WriteLine("
    中国公民对没有中国参与的战争不敢兴趣,小爷我不去!!");
                }
            }

            //假如我们认为:小日本不可能发起进攻,只有可能挨打
            private static void JapDoWork(string attacker, string defender)
            {
                if (defender == "
    小日本")
                {
                    Console.WriteLine("
    小日本小泉说:我们小日本是永远不会被征服的");
                }
                else
                {
                    Console.WriteLine("
    小日本小泉说:NND,不打老子!");
                }
            }


            //
    中立者认为:谁打谁都行,反正跟我没关系
            private static void NuetralDoWork(string attacker, string defender)
            {
                Console.WriteLine("
    据说<" +attacker +"><" + defender + ">发起了轰炸!跟我没关系,没人打我就行!额...TM自私了!");
            }
        }
    }
    运行结果:


            图片
    今天就到这里,明天在补充事件模型的。 

  • 相关阅读:
    [Go] golang http下返回json数据
    [Go] Golang练习项目-邮箱imap网页版客户端工具
    [Go] 提供http服务出现两次请求以及处理favicon.ico
    [Go] 转换编码处理网页显示乱码
    [Go] go转换gbk为utf8
    [Go] golang x.(type) 用法
    [GO] go语言中结构体的三种初始化方式
    [PHP] create_function() 代码注入问题已经被弃用
    [Git] 彻底删除github上的某个文件以及他的提交历史
    [javascript] vuejs的elementui实现父子iframe通信
  • 原文地址:https://www.cnblogs.com/sgll-290494386/p/3191623.html
Copyright © 2020-2023  润新知