如何定义布尔表达式并仅在使用时对其进行求值?

时间:2016-05-17 03:34:14

标签: c# .net boolean lazy-evaluation

让我们直接举个例子:

public bool MeetsAllConditions()
{
    bool check1, check2, check3;

    // Some code to define result of check1
    if (something...)
    {
        if (something...)
        {
            check1 = true;
        }
    }

    // many more code to define check2 and check3
    ....

    if (check1 && check2 && check3)
    {
        return true;
    }
    return false;
}

现在,定义每个check的代码非常昂贵。因此,我想这样做,以便定义每个检查结果的代码 最终 if语句。这样,如果任何检查失败,我可以利用延迟评估来节省资源。

如果不为C#中的每个check定义单独的方法,我将如何处理此

2 个答案:

答案 0 :(得分:3)

这取决于“单独方法”的含义。如果您愿意在代码中内联创建委托,您可以执行以下操作:

Func<bool> check1 = () =>
{
  if(something...)
  {
    if(something...)
    {
      return true;
    }
  }
}
...

return check1() && check2() && check3();

另一个选择就是短路并在你发现任何可能导致你返回虚假的事情时提前返回。

if(!something...)
{
  return false;
}
if(!something...)
{
  return false;
}
... // same pattern for check2 and check3
return true;

答案 1 :(得分:2)

为什么不使用Lazy<T>

来自MSDN

  

使用延迟初始化来推迟创建大型或   资源密集型对象,或资源密集型的执行   任务,特别是当这种创建或执行可能不会发生时   在该计划的整个生命周期中。

既然您已经提到了昂贵的流程,为什么不将昂贵的流程封装在Type?