.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
{
//对外传递信息,表达attacker向defender发起了战争攻击
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自私了!");
}
}
}
运行结果:
今天就到这里,明天在补充事件模型的。