分享
 
 
 

经历现实与虚幻的两难

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

经历现实与虚幻的两难

—一个.Net事件机制实例

今天,发薪日。刚过去的三十天里,我把二十天都献给了公司,以公司为家,让新婚的老婆独守空闺,现在盘算着为她买点东西、陪她看场电影、吃个饭什么的,好补偿一下。谁知临下班时,一个晴天霹雳让人欲哭无泪。公司高层开完会就发了通知,告诉我们这个开发小组,因为项目延期,上个月的薪水和奖金大家就都别领了。本来兄弟们最盼望的就是今天了,可是现在……。哎,该怎么办?暗自忿忿还是据理力争,婉言提醒还是直述胸臆,这真是一个难题。在对这件事的态度上,组员们产生了分歧。一部分认为应该找代表和公司交涉,以维护我们的权益;另一部分则认为不应该和公司闹不和,还是“忍辱负重,苟且偷生”方为上策。

由于一些因素(项目延期),一个类型(公司)发生了一件事(扣发薪水和奖金),另一些类型(主战派、主和派)在得知这件事后,采取了一些行动(维护权利和忍辱负重)。

在CLR中存在事件模型,可以模拟上面的事件。事件在计算机程序中是非常有用的,甚至可以说是是举目所及,概莫能外。

事件的产生

为了完成产生事件的类型,我们需要的“东西”有:

1、一个存放事件相关信息的类型

2、一个委托类型和一个事件

3、在一个方法内部,“事件”发生了

4、一个发出事件已发生的通知的方法,我称之为“警报器”

上面的“东西”都位于SoftwareComplany类型。

1、事件信息类型应该继承自System.EventArgs类型,在命名风格上,建议在该类型名的末尾加EventArgs,表示该类型是一个事件信息类型。

public class DecisionMakingEventArgs : System.EventArgs

{

private readonly System.String causation, result;

public DecisionMakingEventArgs(System.String causation,System.String result)

{

this.causation = causation;

this.result = result;

}

}

2、委托类型的命名,推荐以EventHandler结尾。该类型有两个参数:发出事件通知的对象、事件信息类型;而事件其实就是委托的实例。

public delegate void DecisionMakingEventHandler (System.Object source, DecisionMakingEventArgs mEventArgs);

public event DecisionMakingEventHandler DmMsg;

3、在下面的方法内,“事件”发生了。

public void Conference(System.String causation,System.String result)

{

DecisionMakingEventArgs e =new DecisionMakingEventArgs(causation, result);

//下达会议决策

OnDmMsg(e);

}

4、“警报器”方法。在这个方法内,首先查看是否有类型“订阅”了该事件。如果有,就通知这些“订阅”事件的类型。

private void OnDmMsg(DecisionMakingEventArgs e)

{

//查看是否有类型“订阅”了该事件

if(DmMsg != null)

{

//发出警报

DmMsg(this, e)

}

}

事件的订阅

ProgrammerEmployee类型和FinanceEmployee类型都“订阅”了DmMsg事件,但在对该事件的“态度”上,两个类型是完全不一样的。

懒惰、高傲、怀疑一切的程序员们要维护自己的权益,和公司斗争到底,如果公司一味“咄咄相逼”,那宁为玉碎,不为瓦全;勤奋、卑微、永远相信上级,但“笑厣如花”的财务人员却要检讨自己,并任由公司“宰割”。哎,女人啊,你的名字是弱者。

public class ProgrammerEmployee

{

public ProgrammerEmployee(SoftwareComplany sc)

{

sc. DmMsg += new SoftwareComplany(PEMsg);

}

private void PEMsg(System.Object source,

DecisionMakingEventArgs e)

{

System.Console.WriteLine(“壮志饥餐胡虏肉,笑谈渴饮匈奴血”);

}

}

public class FinanceEmployee

{

public FinanceEmployee(SoftwareComplany sc)

{

sc. DmMsg += new SoftwareComplany(FEMsg);

}

private void FEMsg(System.Object source,

DecisionMakingEventArgs e)

{

System.Console.WriteLine(“新样靓妆,艳溢香融,羞杀蕊珠宫女”);

}

}

完整的代码

//公司类型

public class SoftwareComplany

{

//事件信息类型

public class DecisionMakingEventArgs : System.EventArgs

{

//相关信息字段

private readonly System.String causation, result;

public DecisionMakingEventArgs(System.String causation,System.String result)

{

this.causation = causation;

this.result = result;

}

//委托原型

public delegate void DecisionMakingEventHandler(System.Object source, DecisionMakingEventArgs mEventArgs);

//定义事件

public event DecisionMakingEventHandler DmMsg;

//每月例会

//公司体制不健全,所以会议纪要从来不记录时间

public void Conference(System.String causation,System.String result)

{

DecisionMakingEventArgs e = new DecisionMakingEventArgs(causation, result);

//警报器

OnDmMsg(e);

}

private void OnDmMsg(DecisionMakingEventArgs e)

{

//查看是否有类型“订阅”了该事件

if(DmMsg != null)

{

//发出警报

DmMsg(this, e)

}

}

}

}

public class ProgrammerEmployee

{

public ProgrammerEmployee(SoftwareComplany sc)

{

sc. DmMsg += new SoftwareComplany(PEMsg);

}

private void PEMsg(System.Object source, DecisionMakingEventArgs e)

{

//恨不能“食其肉,寝其皮”

System.Console.WriteLine(“壮志饥餐胡虏肉,

笑谈渴饮匈奴血”);

}

}

public class FinanceEmployee

{

public FinanceEmployee(SoftwareComplany sc)

{

sc. DmMsg += new SoftwareComplany(FEMsg);

}

private void FEMsg(System.Object source, DecisionMakingEventArgs e)

{

//小样

System.Console.WriteLine(“新样靓妆,艳溢香融,羞杀蕊珠宫女”);

}

}

public class app

{

public static void Main(System.String[] args)

{

SoftwareComplany sc = new SoftwareComplany();

ProgrammerEmployee pe = new ProgrammerEmployee();

FinanceEmployee fe = new FinanceEmployee();

//开会

sc. Conference(“项目延期”, “扣发薪金”)

}

}

吹毛求疵

世间有太多吹毛求疵的人了,在项目开发中,差不多每一个人都是这样的。程序员一方面希望客户能充分了解自身的需求,另一方面又希望自己的程序能“Do more with less”(不知道借用时下流行的广告词是不是涉嫌侵权)。当然,我们不但无法对客户的素质有所要求,还得提心吊胆的把他们好好供着、伺候着,谁叫他们是我们的衣食父母呢。所以,如果碰上的客户清楚的了解自己需要些什么,那并不是我们的素质高,而且不论我们怎样的修行,都无法对此产生一丁点的裨益,碰上这样的客户,我们应该感谢上帝,感谢真主阿拉,感谢我佛慈悲,感谢所有能感谢的人,不过千万不要“感谢”自己。而“程序”是我们吃饭的家伙,把它玩的越蕴贴,你的希望就越能实现。所以,如果真的碰上了上面所说的那种客户,与其花时间感谢过来感谢过去的,不如多花点时间来把玩自己的程序,这样才对的起那样的客户嘛(也说不定圣明的上帝万能的真主看到你这样的“虔诚”,会让你多遇上几个这样的客户哦)!

看得更清楚一点

发布事件的类型把订阅信息存放在哪里的,这点从表面上看,应该是DmMsg中,但其实CLR隐藏了一些东西—一个私有的字段,该字段是一个委托类型的实例,可以把它看成是链表,用以存储相关类型的订阅信息,DmMsg就是使用该字段存储相关订阅信息。CLR允许程序员显示定义该字段,虽然会多出一部分代码,但带来的效果(提升性能)却值得这样做。

//定义委托

public delegate void DecisionMakingEventHandler(System.Object source, DecisionMakingEventArgs mEventArgs);

//显式定义链表

private DecisionMakingEventHandler dmDelegate;

//定义事件,但事件注册和事件注销都需要显示定义

public event DecisionMakingEventHandler DmMsg

{

//事件注册

add

{

dmDelegate = (DecisionMakingEventHandler)

System.Delegate.Combine(dmDelegate, value);

}

//事件注销

remove

{

dmDelegate = (DecisionMakingEventHandler) System.Delegate.Remove(dmDelegate, value);

}

}

做改动的地方还有OnDmMsg方法,警报改由链表字段发出而已“dmDelegate(this, e)”。这样,新版本的事件就完成了。

真实

本文水平不会高到哪里去,但看过之后对.Net的事件还是应该能有一番认识吧。

参考书籍

l Jeffrey Richter著《Applied Microsoft .Net Framework Programming》,Microsoft Press出版

2 余秋雨著《千年一叹》,作家出版社出版

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有