通过Demo来细看C#事件的内在机制
2010-09-30 22:44:34 来源:WEB开发网根据这个Demo,针对委托和事件而言,需要注意一些要点,我这里列举出来:
1、 上面的委托委托实例化用的是.Net 1.1的语法:
charlesLog.processEvent += new ProcessEventHandler(CustomProcess);
(注:)随着Net版本升级,委托实例化的语法简化,在2.0有匿名方法,以及3.0的Lambda表达式更能符合人类语言。
2、 申明事件的语法是:”修饰符” event <委托类型> 事件名”,实际上是比申明委托实例多了一个event关键字而已。
3、 使用”+=”符合的时候会根据委托进行自动判断:
如果此时委托还没有实例化(null),它会自动用+=来对委托实例化。
如果委托已经实例化,它用+=来把函数注册委托指定的委托链上。
4、 事件(上面的processEvent)注册事件处理程序只能用+=或者-=,不能用=。否则会出现
CharlesLog.processEvent只能出现在+=或-=的左边(CharlesLog类中使用除外)。
注意委托(delegate)是可以用=号来实例化
OK,上面提出的几点都是平常我们要注意的地方。如第4点,也许你会问为什么委托可以用=,而事件却不能用=号,而只能用+=和-=呢?通过Reflactor工具来看一看event背后发生的事情:
public event ProcessEventHandler processEvent;
通过C#编译器会编译成:
可以看到,尽管这里定义的processEvent申明为public,但是实际上processEvent会被编译成私有字段(到这里你应该晓得为什么对于事件你不能在外部用”=”,但是对于内部可以用”=”)。因为它根本不允许在CharlesLog的外面已赋值的方式来访问。我们进一步看一下:
更多精彩
赞助商链接