十一 事件
谈谈使用
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

浙公网安备 33010602011771号