作者QQ29 (我爱阿蓉)
看板C_Sharp
标题Re: [问题] event 和 delegate
时间Tue Nov 30 22:31:41 2010
请教各位~
我用Reflector去看他反组译後的程式
发现如下
private EventHandler OnEvent;
public event EventHandler OnEvent
{
add
{
EventHandler handler2;
EventHandler onEvent = this.OnEvent;
do
{
handler2 = onEvent;
EventHandler handler3 = (EventHandler)
Delegate.Combine(handler2, value);
onEvent = Interlocked.CompareExchange<EventHandler>(ref
this.OnEvent, handler3, handler2);
}
while (onEvent != handler2);
}
大方向和 Cole 大说的一样
不过他多了一个do while并且作了一个判断
但我查了一下
CompareExchange 比较 1和3的参数instance是否指向同一个 若一样就让1指向2
他一开始handle2 就指向onEvent 所以 CompareExchang 乍看之下一定会让
ref this.Onevent 变成指向handle3(新增後的结果)
但为啥要把这local的 onEvent最後再指向CompareExchange回传的原先值呢(还原)
然後while因为 条件不成立 跳出
搞得看起来while没意义 根本可以不用这样翻阿?
是有什麽考量或是 我误解的地方呢
还是刚好这个interlock可以刚好做到multi-thread的保护
可是仔细想想
如果改成这样
do
{
lock (this)
{
this.OnEvent = (EventHandler)Delegate.Combine(this.OnEvent2,
value);
}
}while(false);
不就好了吗?
也可以做到 multi thread的保护 乍看之下也没有问题....
请问一下 他那种写法 有什麽意义吗~
谢谢
※ 引述《cole945 (躂躂..)》之铭言:
: delegate 和 event 的差别,
: 其实就像 field 和 property 的差别,
: property 提供 getter/setter 来操作 field, 来避免不正确的付值,
: event 的目的也是一样, 提供 adder/remover 来操作 delegate
: 以大家常见的 EventHandler delegate 来举例
: public event EventHandler OnEvent;
: 其实是像
: private EventHandler _onEvent; <-- implicitly generated delegate
: public event EventHandler OnEvent
: {
: add
: {
: _onEvent = (EventHandler)Delegate.Combine(_onEvent, value);
: }
: remove
: {
: _onEvent = (EventHandler)Delegate.Combine(_onEvent, value);
: }
: }
: 这就像 default property
: public int MyProperty
: {
: set; get;
: }
: 其实是如下的code是一样的意思..
: private int _MyProperty; <-- impilictly declared
: public int MyProperty
: {
: set
: {
: _MyProperty = value;
: }
: get
: {
: return _MyProperty;
: }
: }
: event出现的目的就跟property一样, 是为了隐藏 delegate 这个 list 的
: 实作细节, 多一个可以在中间操作的机会..
: 例如, 加多 multithread 的保护 (lock), 或是可以从中拦截 delegate
: 桥接到适当的 object 手上..
: 语法上的差异当然有, 但其实不是重点
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.87.64.222
※ 编辑: QQ29 来自: 219.87.64.222 (11/30 22:34)
※ 编辑: QQ29 来自: 219.87.64.222 (11/30 23:02)
1F:推 petrushka:应该只是在不使用lock的情况下,确保combine前後,串列没 12/02 16:01
2F:→ petrushka:有被更改!如果combine的过程中,delegate串列更动了,下一 12/02 16:02
3F:→ petrushka:再尝试add value到串列中!如果用lock,基本上while也不需 12/02 16:02
4F:→ petrushka:要! 但是, lock一整个delgate串列, 好吗? 12/02 16:03
5F:→ QQ29:不晓得耶 这样感觉也OK阿 跟他的比起来又简单 效率会差吗? 12/04 02:07
7F:→ deuter:看来是 C# 4.0 才开始用这样的code 12/04 15:16
8F:→ deuter:这四篇blog有详细的说明 等有空再仔细读 12/04 15:17