【问题标题】:How to define a boolean expression and evaluate it only when used?如何定义布尔表达式并仅在使用时对其进行评估?
【发布时间】:2016-09-12 23:50:06
【问题描述】:

让我们直接上一个例子:

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 的代码非常昂贵。因此,我想让定义每次检查结果的代码在 only in final if 语句中进行评估。这样,如果任何检查失败,我可以利用惰性评估来节省资源。

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

【问题讨论】:

  • 您可以在您的 check1 行之后执行像 if (!check1) return false; 这样简单的操作,并且在每次后续检查之后执行类似操作。然后只需在底部return true;
  • 但是,“更多代码”乘以 3 表示如果您确实为每次检查创建单独的方法,您的代码将更易于维护。
  • 我不想让它们成为单独的方法,因为它们对我正在编写的主要方法来说太具体了。在每条语句之后返回 false ..似乎让我的代码变脏了 :( 但感谢您的建议!
  • 也许您正在编写的主要方法应该移动到它自己的类中,然后检查方法可以是该类的私有方法?需要考虑的事情。

标签: c# .net boolean lazy-evaluation


【解决方案1】:

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

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

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

另一种选择是简单地短路并在您发现可能导致您返回 false 的任何事情时提前返回。

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

【讨论】:

  • 我猜OP想要在不定义方法的情况下实现。 How would I approach this without defining a separate method for each check in C#?
  • @HariPrasad:是的,但是“分离方法”是什么意思?他只是指一个命名的方法吗?这就是我的第一句话要指出的。
  • 嘿,谢谢,我想知道是否有一些神奇的逻辑可以阻止定义方法并实现这一点。我不想使用方法,因为我想将它们保留在我的 MeetsAllChecks() 中,因为它们非常特定于方法。
  • 但实际上delegate 很有趣,我来自java 背景,并没有真正意识到这样的事情......这将是我正在寻找的东西!谢谢!
  • 在 C# 中,if 语句表达式已经短路,因此您无需为每个条件使用自己的 return 编写独立的 if 语句(因此您的第二个选项是多余的)。
【解决方案2】:

为什么不使用Lazy&lt;T&gt;

来自MSDN

使用延迟初始化来延迟创建大型或 资源密集型对象,或资源密集型的执行 任务,特别是当此类创建或执行可能不会发生时 在程序的生命周期内。

既然你提到了Expensive Process,为什么不将昂贵的过程封装在一个Type中呢?

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多