我认为我的观点很清楚,在任何情况下,这都会抛出空引用异常吗?即,在尝试访问其Count
属性时,反对e.Result为null。
if (e.Result == null || e.Result.Count == 0)
return;
编辑:为了充分利用这个问题(对于后来的问题),我们如何防止异常发生,我们可以使用lock
语句吗?如何?
答案 0 :(得分:8)
只有在方法不是线程安全的情况下,该代码才会抛出NullReferenceException。这意味着,如果另一个线程决定在e.Result
检查之后和e.Result == null
检查之前的确切时刻将{null}分配给e.Result.Count == 0
。
答案 1 :(得分:3)
只有在e为空时才会这样做。
答案 2 :(得分:1)
e == null
OR
多线程&竞争条件?
答案 3 :(得分:1)
没有。 - 首先评估e.Result == null,如果为真,则立即调用return,不评估第二种情况。它可能在线程方面有所不同
答案 4 :(得分:1)
如果Result
后面有自己的代码,并且该代码因错误而失败,则可能会抛出“Null-Reference Exception”。
答案 5 :(得分:0)
EventArgs args = e;
if (args.Result == null || args.Result.Count == 0)
{
return;
}
您的想法是首先将事件args(e)复制到您自己的本地元素中,然后将其用于if条件检查。注意确保副本足够深以复制结果(否则当另一个线程刚刚通过if检查中途结果时,你仍然会遇到多线程情况)。本地副本始终是线程安全的。
答案 6 :(得分:0)
除了其他人已经指出的多线程/竞争条件问题之外,您可能正在寻找的主题是 short-circuit evaluation。在C#中,||
运算符使用短路(与急切的|
相反),因此如果e.Result == null
的计算结果为真,则不会评估e.Result.Count == 0
。
其他人已经回答了,但我想给你这种行为的名称和一些进一步阅读。