这个`if`语句会产生Null-Reference Exception吗?

时间:2011-02-26 14:44:33

标签: c# if-statement nullreferenceexception logical-operators

我认为我的观点很清楚,在任何情况下,这都会抛出空引用异常吗?即,在尝试访问其Count属性时,反对e.Result为null。

if (e.Result == null || e.Result.Count == 0)
    return;

编辑:为了充分利用这个问题(对于后来的问题),我们如何防止异常发生,我们可以使用lock语句吗?如何?

7 个答案:

答案 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

其他人已经回答了,但我想给你这种行为的名称和一些进一步阅读。