首页 新闻 会员 周边 捐助

.net事件处理程序中非空测试的疑问

0
悬赏园豆:10 [已解决问题] 解决于 2008-09-16 18:10

大家好。《.net设计规范》第128页第一段有点不解:

书上举例说,一个事件处理方法中:

if (Click != null) Click(this, e); 这里可能存在竞态条件,在第一行和第二行之间事件可能会被清除。

这要怎么理解呢?

书上下一段:

实际上开发人员应该这样写:

ClickHandler handler = Click;

if (handler != null) handler(this, e);

这段写法和上一段写法区别在哪?如果说上面那一段的if那一句不是原语操作,那下面那段不也是一样的么?改进在哪?

谢谢指点!:)

水言木的主页 水言木 | 小虾三级 | 园豆:586
提问于:2008-09-11 16:07
< >
分享
最佳答案
0

先看看第一种方法

1. if (Click != null)

2.     Click(this, e);

假设现在有多线程,2个线程分别为A和B,执行如下

1(A). if (Click != null) //这里是true

2(B). Click = null; //B线程正好把Click变成null

3(A). Click(this, e); //很遗憾,这里是NullReferenceException

 

再看第2种方法

1(A). ClickHandler handler = Click; //用变量handler保存Click的引用

2(B). Click = null; //Click虽然是null了,handler依旧不是null

3(A). if (handler != null) //这里是true

4(A). handler(this, e); //由于handler是A线程拥有的本地变量,B线程无法干涉,因此handler肯定不会在判断null之后被其他线程赋值,所以此处handler肯定不会是null

Gray Zhang | 专家六级 |园豆:17610 | 2008-09-11 17:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册