2

您好,我正在考虑写什么更好(在速度和/或效率方面):

bool Method(...) { ... }

...

bool result = Method(...);

if (result == false)
{ ... }
// or

if (!result)
{ ... }

或者,另一种...

if (result == true) 
// or

if (result)

我问是因为我使用第一个 ( result == false) 但有时它会变得很长,尤其是在condition ? expr : expr语句中。

4

7 回答 7

9

就个人而言,每当我看到类似result == false. 在我看来,这是对相等运算符的相当讨厌的误用,而且完全没有必要。虽然我认为编译器应该将两个表达式转换为相同的字节码,但您肯定希望使用!result. 确实,它不仅是更直接和合乎逻辑的表达方式,而且正如您所提到的,它使代码更短且更具可读性。我认为绝大多数 C# 程序员都会同意我的观点。

于 2009-04-05T15:08:43.837 回答
4

运行时速度是相同的 - 两个片段都编译为相同的 MSIL 代码表示。

使用(result == false)而不是(!result)感觉有点草率。

于 2009-04-05T15:11:30.697 回答
2

运行时代码没有性能差异。我工作的公司中的大多数编码指南都更喜欢 !result。

于 2009-04-05T15:24:36.263 回答
1

我不认为有任何区别,如果有的话,你可能很难测量它。任何差异都可能存在于测量的噪声中。

于 2009-04-05T15:08:21.437 回答
1

您绝对应该将表达式与 ! 运算符,不是因为它更快,而是因为它更安全。

如果您不小心使用了一个等号而不是两个等号,则将值分配给变量而不是比较值:

if (result = false) {

对于其他数据类型,编译器可以捕捉到这一点,因为表达式 like(id = 42)具有整数值,因此不能在 if 语句中使用,但表达式 like(result = false)具有布尔值,因此编译器必须接受它。

(一个古老的 C 技巧是把文字放在第一位,这样它就不会是一个赋值,但它的可读性较差,所以 ! 运算符是一个更好的选择。)

于 2009-04-05T15:27:38.083 回答
1

尽管我同意if(!result)首选@Noldorin,但我发现if(result == false)如果您必须测试可空的布尔值(这在数据访问场景中最常发生),它及其同类非常有用。

编辑:这是一个示例程序,它解释了在可为空的布尔值上使用相等运算符的不同方式。

class Program
{
  static void Main(string[] args)
  {
    TestNullBool(true);
    TestNullBool(false);
    TestNullBool(null);
    Console.ReadKey();
  }

  private static void TestNullBool(bool? result)
  {
    if (result == null)
    {
      Console.WriteLine("Result is null");
    }
    if (result == false)
    {
      Console.WriteLine("Result is false");
    }
    if (result == true)
    {
      Console.WriteLine("Result is true");
    }
  }
}
/* Output:
Result is true
Result is false
Result is null
*/
于 2009-04-05T15:32:42.533 回答
1

我认为这个过程分为三个步骤。首先,你认为 if 中应该总是有比较,所以你写 if(this.isMonkey == true)banana.eat();

或者,更现实地

if(SpeciesSupervisor.getInstance().findsSimilarTo(Monkey.class, 2) == true) {
    String f = new PropertyBundle("bananarepo").getField("banana store");
    EntitiyManager.find(Banana.class,f).getBananas().get(1).eat();
}

然后,您了解到询问 if(this.isMonkey) 是很好的,并且这种格式可以更好地阅读本示例中的句子(“如果这是一只猴子”)。

但最后,你变老了,你知道 if(b) 不是很可读,if(b==true) 给你可怜的大脑一些线索这里发生了什么,以及所有这些“滥用”的严厉主张、“虐”、yada yada,都有些言过其实了。

至于表现。在 Java 中,它不会产生任何影响。我认为.NET 并没有那么糟糕。这是编译器可以做的最简单的优化,我敢打赌,性能是一样的。

干杯,

尼可

于 2009-04-05T15:33:16.523 回答