作者gyps2 (整个无脑)
看板C_Sharp
标题Re: [讨论] Event和Delegate.....
时间Fri Jun 24 10:02:22 2005
: 基於工程师都是自尊心超强的动物..我也不敢惊动这位宝贝蛋只好看看他的
: CommunicationService到底是怎样定义的..如下
: delegate void ErrorHandler(object obj, ErrorHArg arg);
: internal absract class CommunicationService
: {
: public ErrorHandler Error; <<看到没,真是宝贝的写法
: ....
: }
: 难怪宝贝工程师可以在其他的class中trigger Error,因为Error根本不是一个
: event只是delegate...
: 根据我的猜测(还是不敢惊动那位宝贝)这位宝贝可能基於效率的考量,所以
: 不想在使用一个event当作间接层,不过既然M$已经定义出了Event,文件上
: 的范例也都是用Event就应该有其意义,所以小弟只好在去翻了一下果然MSDN
: 中C# spec.清楚说明了event是基於delegate的改良,无论event是不是宣告
: 为public,只有拥有event的物件可以trigger
: [MSDN节录]
: The event keyword lets you specify a delegate that will be
: called upon the occurrence of some "event" in your code. The delegate
: can have one or more associated methods that will be called when your
: code indicates that the event has occurred.
这麽基本的事情需要特别去查喔...
: Event就小弟看来和delegata本质上是完全不同的,delegate说实在的不过是
: 一个具备type safe的function pointer,还具备了list可以指向数个不同的
: function(method)除此之外没什麽特别的,event概念上完全不同,event代表
: 事件的发生,什麽叫事件?举个例子
这不是废话吗,看你还是社会人士这种C#第一天就教的废话需要拿出来说明喔?
: 汽车旅馆的物件可以在我和林志林去打泡的时候和警察局和水果日报说
: 『林志林和一个有为青年开房间』,警察局和水果日报可以依据这件事情
: 做出不同的处理,比如警察局会冲过来找我签名,水果日报也会马上派一堆
: 记者来访问我,同一个事件对不同的物件有不同的意义,拥有事件的物件
: (这里是汽车旅馆)有发出事件声明的权利和义务,而希望得到事件的物件
: (subscriber)也有义务对publisher(汽车旅馆)说明他想要收到事件,这和
: delegate根本是两回事, 上面那个宝贝的写法套到这个例子就变成
: 水果日报对於明星和有为青年的打泡行为很有兴趣,於是水果日报巧妙的
: 安排我和林志林到汽车旅馆开房间,在对自己发布消息派人采访...
: 原本是我用自己的魅力代林志林去开房间变成了水果日报的阴谋,我当然会不爽
: 物件间的分工都被搞乱了,还有原本可以不相关的两个物件(水果日报和汽车旅馆)
: 现在也变的有关系,增加了不必要的耦合(coupling)...
上面整个给他无聊,这里不是joke版也不是hate版,你po错了!白痴
: Event应注意的事项
: 1.Event handler 传回值应为void
: 2.基於日後维护和generic的考量,建议event handler的参数应为
: (object sender, eventArg arg)
: sender代表发出event的物件,arg则自订event发出时附带的资讯
: 3.触发event前应确认已经有subcriber将eventhandler加入list
: if(event1 != null)
: event1(...);
又是节录MSDN的废言一堆,赚P币喔现实生活赚太少?
: 在现今强调分工,合作的发展上这绝对是一个要命的错误,日後debug时
: 这也很容易变成盲点(谁会想到这是水果日报的阴谋?),造成无谓的时间浪费。
: 另外我要对event补充一点,假如一个物件要管理大量的event时可以使用
: EventHandlerList class
: 举个例子,这边假设一个物件叫汽车旅馆,会发出下面几种event
: 1.明星开房间
: 2.政治人物开房间
: 3.宝贝工程师的队长昏倒住房间
: delegate void 明星开房间Handler(object obj,string name);
: delegate void 政治人物开房间Handler(object obj,string name);
: delegate void 队长昏倒Handler(object obj,string name);
: class 汽车旅馆
: {
: EventHandlerList _eventList = new EventHandlerList();
: public event 明星开房间Handler 明星开房间
: {
: add
: {
: //下面的"明星开房间:字串只是一个Key值可以用任何object取代
: _eventList.AddHandler("明星开房间",value);
: }
: remove
: {
: _eventList.RemoveHandler("明星开房间",value);
: }
: }
: //另外两个event用一样的方法即可
: //trigger 明星开房间 event
: protected void trigger明星开房间()
: {
: string name = "林志林";
: //"明星开房间"是刚刚加入event设定的key
: EventHandler handler = (EventHandler)_eventList["明星开房间"];
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
拿出你的良心,你确定这行没有写错?
EventHandler handler = (明星开房间Handler)_eventList["明星开房间"];
看看上面正确的写法,你这种水准还赶到这个版po了一大堆错误连篇
的废文,真是厚脸皮又无知到极点
: handler(this,name);
: }
: //另外两个事件trigger以此类推
: }
: 最後感谢宝贝工程师让我花了一个小时确认event..
工作上面的问题有什麽好在BBS上面说的?这是你公司的专版吗?
正确的作法不是应该找当事人讨论吗,全部都自己臆测,怕事没肩膀
还敢再BBS上面大放厥词,脸皮之厚乃我生平仅见,劝你赶快删文不要丢脸了
不过来不及了,我已经帮你备份了 XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.75.23.122
1F:嘘 virdust2003:《上站次数》2次XD 140.113.164.7 06/24
2F:嘘 Eric30:= = 140.113.138.30 06/24
3F:推 kojilin:同ip呢...fun.. 140.138.238.12 06/24
4F:嘘 sheauren:回文只有谩骂的文章是不是该叫板大砍了 220.131.14.140 06/25
5F:嘘 xeiyan:....呃...多重人格 163.25.118.31 06/25
6F:→ psvsps2:不好意思造成大家的困扰,这IP的确是我们公司 211.75.23.122 06/27
7F:→ psvsps2:对外的IP....但我也没办法找出po文的人,只能说 211.75.23.122 06/27
8F:→ psvsps2:这世界太小.. 211.75.23.122 06/27