WEB开发网
开发学院软件开发C语言 通过Demo来细看C#事件的内在机制 阅读

通过Demo来细看C#事件的内在机制

 2010-09-30 22:44:34 来源:WEB开发网   
核心提示: 根据这个Demo,针对委托和事件而言,需要注意一些要点,通过Demo来细看C#事件的内在机制(2),我这里列举出来:1、上面的委托委托实例化用的是.Net 1.1的语法:charlesLog.processEvent+=newProcessEventHandler(CustomProcess);

根据这个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#编译器会编译成:

通过Demo来细看C#事件的内在机制

可以看到,尽管这里定义的processEvent申明为public,但是实际上processEvent会被编译成私有字段(到这里你应该晓得为什么对于事件你不能在外部用”=”,但是对于内部可以用”=”)。因为它根本不允许在CharlesLog的外面已赋值的方式来访问。我们进一步看一下:

上一页  1 2 3 4  下一页

Tags:通过 Demo 细看

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接