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