【发布时间】:2016-07-26 16:03:09
【问题描述】:
我有这样的表达方式:
EqualByComparer comparer;
if (ListEqualByComparer.TryGetOrCreate(x, y, out comparer) ||
EnumerableEqualByComparer.TryGetOrCreate(x, y, out comparer))
{
return comparer.Equals(x, y, compareItem, settings, referencePairs);
}
ListEqualByComparer.TryGetOrCreate 是否总是在 EnumerableEqualByComparer.TryGetOrCreate 之前被调用?
【问题讨论】:
-
是的,如果返回true,则不会调用EnumerableEqualByComparer.TryGetOrCreate(x, y, out comparer)(短路评估)
-
另见Operator || - 在
if (x || y)中保证x将被检查(首先)。如果x是true,则y将不会被评估。 -
我相信是这样,这个确切的上下文就是它的原因。代码以这种方式编译以节省内存,如果第一个条件为真,则不必评估第二个条件
-
抱歉骗了我,我搜索了但失败了。
-
请注意,序列是固定的并且仅在必要时才调用第二个条件这一事实通常既重要又有用。我经常写
if (foo == null || foo.bar())之类的条件