【问题标题】:How to avoid short-circuit operation without using bitwise operators如何在不使用位运算符的情况下避免短路操作
【发布时间】:2012-04-24 18:40:14
【问题描述】:

我正在尝试看看是否有更好的方法来编写以下内容:

if ((DirectoryDetailsPath == null) & (FileDetailsPath == null))
{
  Console.WriteLine("Error: Path for 'Directory' or 'File' has to be specified.");

}

不使用按位“&”运算符。我更喜欢使用逻辑运算符,但由于短路,我无法评估这两个字段。

我只想在两个字段都为“null”时看到错误。

谢谢

【问题讨论】:

  • 为什么如果您知道第一个之后的结果,您为什么要评估两者?如果你真的需要评估两者,为什么不使用&
  • 评估两者的唯一原因是它们是否有一些副作用,这是糟糕的编程风格。在这种情况下,应首先评估方法,然后在条件中检查其结果
  • bool operator&(bool a, bool b) 实际上并未定义为“按位”运算符。虽然这一点是学术性的,并且经常被称为按位。
  • @JonSkeet 我正在尝试评估两者,因为我的条件是仅当两个值都为空时才显示错误。有没有更好的办法?
  • @PranavShah:但是一旦您看到第一个表达式不为空,您知道您不会显示错误消息 - 那么为什么还要评估第二个表达式?

标签: c# operators


【解决方案1】:

我只想在两个字段都为“null”时看到错误。

那就试试&&:

if ((DirectoryDetailsPath == null) && (FileDetailsPath == null))
{
  Console.WriteLine("Error: Path for 'Directory' or 'File' has to be specified.");

}

更多信息:

如果第一个条件为假,上述解决方案将短路。这仍然满足只有两个值都为空时才写入输出的要求。

【讨论】:

  • @MystereMan 对不起对不起,我的错 :)
  • @Jeff 这将导致短路,并在评估“(DirectoryDe​​tailsPath == null)”后立即显示输出。如果第一次检查为真,则不会进行第二次检查,我需要同时测试
  • +1 - && 一旦碰到 False 就会短路...因此会返回 false,这就是你想要的。 ||一旦它达到 True 就会短路,这是提问者可能不小心期望的 &&,这是可以理解的混淆。所以简而言之,Khan 的回答是正确的。
  • @Khan 否决票可能是因为你错了,而 OP 是正确的。 &&在第一个操作数为真时立即短路。
  • @Khan 我刚刚注意到了这一点。这个问题有缺陷;标题与正文不同。
【解决方案2】:

如果您确实必须评估这两个条件并且不想使用按位运算符,请在 if 语句之外执行。

bool isDirectoryDetailsPathNull = DirectoryDetailsPath == null;
bool isFileDetailsPathNull = FileDetailsPath == null;

if (isDirectoryDetailsPathNull && isFileDetailsPathNull)
{
    Console.WriteLine("Error: Path for 'Directory' or 'File' has to be specified.");
}

但是,这真的没有意义。编译器可能会决定内联变量,有效地给你这个,这是你说你不想要的。

if ((DirectoryDetailsPath == null) && (FileDetailsPath == null))
{
    Console.WriteLine("Error: Path for 'Directory' or 'File' has to be specified.");
}

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多