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

本文关键字:false true OR MethodReturnsBoolean 最佳 | 更新日期: 2023-09-27 18:33:09

我一直在写:

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

但我也见过反其道而行之的人:

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

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

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

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

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

。为简单起见。

某些老式的 C 程序员更喜欢"尤达条件",因为如果您不小心使用了单等号,您将收到有关分配给常量的编译时错误:

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 */

第二个例子是我听到的所谓的"尤达条件";"假,此方法的返回值必须是"。这不是你用英语说的方式,所以在说英语的程序员中,它通常被看不起。

在性能方面,真的没有区别。第一个示例通常在语法上更好(因此为了可读性(,但考虑到您的方法的名称,所涉及的"语法"(以及您正在比较布尔值的事实(无论如何都会使相等性检查变得多余。所以,对于一个真实的陈述,我只想写:

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 以确保代码可读。

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

正确的选项是

if (Whatever())

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

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

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

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

你不应该写。

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

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

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

对于布尔值的情况,我不建议使用布尔值:只需使用 if (method())if (!method()) 。 对于布尔值以外的事物,使用尤达语的惯例,例如 if (1 == x)是为了防止错误,因为if (1 = x)会抛出编译器错误,而if (x = 1)不会(它是 C 语言中的有效代码,但可能不是您想要的(。 在 C# 中,此类语句仅在变量为布尔值时才有效,这减少了执行此操作的需要。