5

我一直在写:

if(Class.HasSomething() == true/false) 
{
  // do somthing
}
else
{
  // do something else
}

但我也看到过相反的人:

if(true/false == Class.HasSomething())
{
  // do somthing
}
else
{
  // do something else
}

在性能和速度方面做一个或另一个有什么优势吗?我不是在这里谈论编码风格。

4

9 回答 9

15

它们都是等价的,但我的偏好是

if(Class.HasSomething())
{
  // do something
}
else
{
  // do something else
}

...为简单起见。

于 2012-05-03T15:49:23.293 回答
11

某些老式 C 程序员更喜欢“Yoda 条件”,因为如果你不小心使用了单等号,你会得到一个关于赋值给常量的编译时错误:

if (true = Foo()) { ... }  /* Compile time error!  Stops typo-mistakes */
if (Foo() = true) { ... }  /* Will actually compile for certain Foo() */

尽管这个错误在 C# 中不再编译,但旧习惯很难改掉,许多程序员仍坚持用 C 开发的风格。


就个人而言,我喜欢 True 语句的非常简单的形式:

if (Foo()) { ... }  

但对于 False 陈述,我喜欢明确的比较。
如果我写的更短,以后在查看代码时!Foo()很容易忽略。!

if (false == Foo()) { ... }  /* Obvious intent */
if (!Foo())  { ... }         /* Easy to overlook or misunderstand */
于 2012-05-03T15:53:16.100 回答
5

第二个例子是我听说的“尤达条件”;“假,这个方法的返回值一定是”。这不是您用英语所说的方式,因此在说英语的程序员中,它通常被看不起。

性能方面,真的没有区别。第一个示例在语法上通常更好(因此为了可读性),但考虑到您的方法名称,所涉及的“语法”(以及您将 bool 与 bool 进行比较的事实)无论如何都会使相等检查变得多余。所以,对于一个真实的陈述,我会简单地写:

if(Class.HasSomething()) 
{
  // do somthing
}
else
{
  // do something else
}

这会越来越快,因为 if() 块基本上有一个内置的相等比较,所以如果你编写代码if(Class.HasSomething() == true),CLR 将评估if((Class.HasSomething() == true) == true). 但是,我们在这里谈论的可能是几个时钟的增益(不是毫秒,不是滴答声,而是时钟;在现代处理器中每秒发生 20 亿次的时钟)。

对于 false 条件,在使用 not 运算符:if(!Class.HasSomething())和使用与 false: 的比较之间是一个折腾if(Class.HasSomething() == false)。第一个更简洁,但很容易错过复杂表达式中的那个小感叹号(特别是因为它出现在整个表达式之前),所以我会考虑将其等同于 false 以确保代码可读。

于 2012-05-03T15:48:47.677 回答
1

您不会看到任何性能差异。

正确的选项是

if (Whatever())

唯一应该写== falseor!= true是在处理bool?s 时。(在这种情况下,所有四个选项都有不同的含义)

于 2012-05-03T15:49:34.253 回答
1

您不会看到任何性能差异,任何比较都被转换为相同的 IL...

于 2012-05-03T15:49:39.110 回答
1
if(Class.HasSomething()) 
{
  // do somthing
}

是我的方式。但最好尽量避免HasSomething(). 更好地公开返回值一次并重用它。

于 2012-05-03T15:50:58.350 回答
1

你不应该写。

if(Class.HasSomething())
{
    // do something
}
else
{
    // do something else
}

反而。如果Class.HasSomething()已经是一个布尔值,那么将它与另一个布尔值进行比较是没有意义的

于 2012-05-03T15:51:14.243 回答
0

这里没有性能优势。这种编码风格用于防止程序员键入 = 而不是 == 的情况。编译器会解决这个问题,因为 true/false 是常量,不能分配新值

于 2012-05-03T15:51:18.053 回答
0

对于布尔值,我不建议:只使用if (method())and if (!method())。对于布尔值以外的情况,使用 yoda-speak 的约定,例如,if (1 == x)是为了防止错误,因为if (1 = x)会抛出编译器错误而if (x = 1)不会(它是 C 中的有效代码,但可能不是你想要的)。在 C# 中,只有当变量是布尔值时,这样的语句才有效,从而减少了这样做的需要。

于 2012-05-03T16:02:02.760 回答