最佳实践是:MethodReturnsBoolean == true/false OR true/false == MethodReturnsBoolean

问题描述 投票:0回答:9

我一直在写:

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

但我也看到有人做相反的事情:

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

在性能和速度方面,选择其中之一有什么优势吗?我不是在这里讨论编码风格。

c# performance clr
9个回答
15
投票

它们都是等效的,但我更喜欢

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

...为了简单起见。


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()) { ... }  

但是对于错误陈述,我喜欢明确的比较。
如果我写的较短

!Foo()
,以后查看代码时很容易忽略
!

if (false == Foo()) { ... }  /* Obvious intent */
if (!Foo())  { ... }         /* Easy to overlook or misunderstand */

5
投票

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

就性能而言,确实没有区别。第一个示例通常在语法上更好(因此为了可读性),但是考虑到方法的名称,所涉及的“语法”(以及您将 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 以确保代码可读。


1
投票

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

正确选项是

if (Whatever())

唯一应该写

== false
!= true
的时候是在处理
bool?
时。 (在这种情况下,所有四个选项都有不同的含义)


1
投票

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


1
投票
if(Class.HasSomething()) 
{
  // do somthing
}

是我的方式。但最好尽量避免

HasSomething()
的多个方法调用。最好将返回值公开一次并重复使用。


1
投票

你都不应该写。

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

相反。如果

Class.HasSomething()
已经是布尔值,则将其与另一个布尔值进行比较是毫无意义的


0
投票

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


0
投票

对于布尔值的情况,我不推荐两者:只使用

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

© www.soinside.com 2019 - 2024. All rights reserved.