十一 事件

谈谈使用

public static class bbbb1
{
public static void aaaa1_bbbb() { }
}

public class aaaa1
{
public delegate void aaaa();
public event aaaa bbbb;
public void abc()
{
//使用在这里
bbbb += aaaa1_bbbb;
bbbb
+= (new aaaa1()).aaaa1_bbbb;
bbbb
+= bbbb1.aaaa1_bbbb;
     
//貌似也没什么区别
}

void aaaa1_bbbb()
{
throw new NotImplementedException();
}
}

先上一段简单代码

public class aaaa1
{
public delegate void aaaa();
public event aaaa bbbb;
}


再上一段Reflactor之后的

.event aaaa1/aaaa bbbb
{
.addon instance
void aaaa1::add_bbbb(class aaaa1/aaaa)
.removeon instance
void aaaa1::remove_bbbb(class aaaa1/aaaa)
}
.field private class aaaa1/aaaa bbbb

看到这里 事件给我的感觉是他是对委托的封装

再来

public event aaaa bbbb
{
add
{
aaaa aaaa2;
aaaa bbbb
= this.bbbb;
do
{
aaaa2
= bbbb;
aaaa aaaa3
= (aaaa)Delegate.Combine(aaaa2, value);
bbbb
= Interlocked.CompareExchange<aaaa>(ref this.bbbb, aaaa3, aaaa2);
}
while (bbbb != aaaa2);
}
remove
{
aaaa aaaa2;
aaaa bbbb
= this.bbbb;
do
{
aaaa2
= bbbb;
aaaa aaaa3
= (aaaa) Delegate.Remove(aaaa2, value);
bbbb
= Interlocked.CompareExchange<aaaa>(ref this.bbbb, aaaa3, aaaa2);
}
while (bbbb != aaaa2);
}
}

早知道取一个好名字.......

Delegate.Remove

值得注意的是 当你对一个事件删除一个没有的委托 他是不会报错的

从这里看到 就会想 为嘛要使用事件,申明一个委托变量 自己加委托链不就完了 何必去创建一个事件呢

OK 这段引用的是  jimmyzhang的C#中得委托和事件 

(ps:他得博文是我之前保存的,貌似他现在已经删除了.. 如果不允许使用,请通知我...)

(ps2: 他得博客确实很不错,主要讲的细致,或许不见得讲的多深,但是讲的好,易懂,有兴趣可以去看看)

public static class Program
{



public static void Main()
{
Publishser pub
= new Publishser();
Subscriber sub
= new Subscriber();
pub.NumberChanged
+= new NumberChangedEventHandler(sub.OnNumberChanged);
pub.DoSomething();
pub.NumberChanged(
100);
}

}
public delegate void NumberChangedEventHandler(int count);
public class Publishser
{
private int count;
public NumberChangedEventHandler NumberChanged; // 声明委托变量
//public event NumberChangedEventHandler NumberChanged; // 声明一个事件

public void DoSomething()
{
// 在这里完成一些工作 ...
if (NumberChanged != null)
{
// 触发事件
count++; NumberChanged(count);
}
}
}

public class Subscriber
{
public void OnNumberChanged(int count)
{
Console.WriteLine(
"Subscriber notified: count = {0}", count);
}
}

这里很清楚的说明了 委托变量和事件的区别

还是关于封装上

使用委托变量居然可以直接的使用  pub.NumberChanged(100);

这是不应该的,就跟所有的属性都改成public字段一样.. 虽然没错但是 啊哈

相反你注视掉委托变量的代码,使用事件 pub.NumberChanged(100) 就会报错


由于是做bs 所以现在确实不太好继续深入,多线程之类的都不太清楚..

到时候再来补充吧


总结一下:

事件给我的感觉 本质上就是一个委托,只是ms 给你生成了东西罢了,  似乎又有一点语法糖的味道了..

over





posted @ 2011-09-03 20:49  CallMeTommy  阅读(226)  评论(0)    收藏  举报