2

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

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

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

4

7 回答 7

8

只有当方法不是线程安全的时,该代码才能抛出 NullReferenceException。意思是,如果另一个线程决定在您检查之后和检查之前e.Result的确切时刻巧合地将 null 分配给。e.Result == nulle.Result.Count == 0

于 2011-02-26T14:46:40.597 回答
3

只有当 e 为空时才会这样做。

于 2011-02-26T14:46:41.347 回答
1

Result如果它背后有自己的代码并且该代码因该错误而失败,它可能会抛出“Null-Reference Exception” 。

于 2011-02-26T14:50:33.977 回答
1
e == null

或者

多线程和竞争条件?

于 2011-02-26T14:47:50.020 回答
1

不。 - e.Result ==null 将首先被评估,如果它是真的,那么将立即调用 return 并且不会评估第二种情况。线程可能有不同

于 2011-02-26T14:48:09.380 回答
0

除了其他人已经指出的多线程/竞争条件问题之外,您可能正在寻找的主题是短路评估在 C# 中,||运算符使用短路(与|急切的 相对),因此如果e.Result == null计算结果为 true,e.Result.Count == 0则不会计算 。

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

于 2011-02-26T16:52:03.590 回答
0
            EventArgs args = e;
            if (args.Result == null || args.Result.Count == 0)
            {
                return;
            }

这个想法是您首先将事件 args ( e ) 复制到您自己的本地元素中,并将其用于 if 条件检查。小心确保副本足够深以复制结果(否则当另一个线程刚刚在 if 检查中途将结果归零时,您仍然最终会遇到多线程情况)。本地副本始终是线程安全的。

于 2011-02-26T15:21:48.993 回答