.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自私了!");
        }
    }
}
运行结果:


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

posted @ 2013-07-15 17:41  上官枫  阅读(630)  评论(0编辑  收藏  举报