作者QQ29 (我爱阿蓉)
看板C_Sharp
标题Re: [问题] event 和 delegate
时间Mon Nov 15 00:41:31 2010
你好~
我看了书 消化一下
event这个关键字 我把它删掉 也一样可以编译成功
event这关键字是不是只是一个强调的形容词
并不是真的一定要加
delegate给我的感觉样是 C++的typedef
我的感觉像是 用这个type去new一个instance
而你也可以不用加上event这关键字
在语法上差异
event 在 给他值时 需要用+= 给一个instance
不加event 就可以直接用 +.....
这边不知道有没有根深层的解释 我只是片面的觉得是这样
不知有没有解读错误@@
请指教
※ 引述《petrushka (不放过自己)》之铭言:
: Event原本就是一种delegate!
: 以下是Event的C#原型宣告:
: public delegate void EventHandler( Object sender, EventArgs e )
: 为了统一Event的处理方式,所以.NET帮大家定了这样一个原型,让开发方法有据可循。
: 至於sender要cast成什麽型别,你是负责写Event的程式设计师,就应该会晓得要转的目标。
: 例如:
: Button的Click Event,sender就是来源的Button instance。
: 如果是custom class的custom event,通常在fire event时,就会传入instance本身。
: 而定义custom event时,通常会一并实作custom EventArgs(继承EventArgs类别),然後
: 在fire event时跟着一起当参数传入delegate function,这也是为了日後方便开发人员
: 进行最後的实作。
: delegate与C的function pointer不同的地方是,delegate是可串连的。
: 例如:
: 1.
: SomeDelegate d = SomeMethod1;
: d += SomeMethod2;
: d -= SomeMethod1;
: 2.
: SomeDelegate d = null;
: d += SomeMethod1;
: 所以呢,delegate是可multicast的!
: 有哪些时候用呢?
: 譬如说资料输出,同时存成PDF format与Excel format,我就可以分别写成两个Method。
: 然後串接给我自己的类别输出事件,当事件触发时,资料就会依序传给串连的Method,
: 就会依序存成PDF format与Excel format了。
: ※ 引述《QQ29 (我爱阿蓉)》之铭言:
: : 看了Event的使用
: : 和delegate使用
: : 我却对delegate和event感到很模糊
: : 我在想用C的角度 一般 要写callback function 就用function pointer去指向function
: : 後
: : 再适当时机帮她呼叫
: : 这点 使用delegate就做得到.....我还是无法理解event和delegate最重要的差异在哪
: : 使用时机....
: : C++是比较麻烦 要指向class的non static function要用pointer to member
: : 但似乎C#完全没管这些 直接class.Function就可以传给delegate了
: : 另外想问个小问题
: : event的sender 假如 有个subscriber 和两个不同class内的event注册
: : 当event发生 subscriber的function被呼叫了 sender进来
: : 我怎麽知道 我要cast成哪个sender
: : 相对的....我EventArgs e 我也不知道 e 该cast成什麽耶~?
: : 目前想到这个 目前看书上也没提到怎麽解决....还是根本没这个困扰 我误会了???
: : 以上
: : 请各位指点 thx
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.192.70.221
1F:推 horngsh:event关键字在编译後会先转成delegate关键字, 相关细节复 11/15 11:54
2F:推 horngsh:杂, 而delegate在编译後则是会自动产生CLASS定义,这也就是 11/15 11:54
3F:推 horngsh:为什麽delegate可以用来具现instance. 11/15 11:55
4F:→ remmurds:delegate是一种特殊的类别 所有的delegate(委派)都继承自 11/15 12:57
5F:→ remmurds:Delegate这个类别 而event则是修饰子 将它宣告成事件栏位 11/15 12:57
6F:→ remmurds:所以一楼的说法不太正确 应该是先有delegate的定义才有 11/15 12:59
7F:→ remmurds:event的关键字修饰 例如EventHandler 11/15 12:59
9F:推 horngsh:R大您说太快了吧? event会被转成delegate有暗指delegate较 11/15 16:26
10F:推 horngsh:晚被定义吗? 似乎您自己生义了吧? 11/15 16:27
11F:→ remmurds:你误会了 我所谓的定义是指宣告delegate的签章 11/15 19:41
12F:→ remmurds:例如EventHandler的签章是 11/15 19:42
13F:→ remmurds:宣告成void EventHandler(object sender, EventArgs e); 11/15 19:43
14F:→ remmurds:要先有这个委派的定义才能在类别中以它为成员并加上event 11/15 19:45
15F:→ remmurds:修饰子成为事件栏位 11/15 19:45
16F:→ remmurds:所以我才说你的说法不太对 编译器应该不会有转成delegate 11/15 19:47
17F:→ remmurds:的动作 因为事件栏位本身就是由delegate修饰而来 11/15 19:47
18F:推 horngsh:R大似乎说对了.Good for you. 11/16 11:02