哪种方法最佳:MethodReturnsBoolean == true/false OR true/false == MethodReturnsBoolean

Ray*_*eng 3 c# compiler-construction clr performance

我一直在写:

if(Class.HasSomething() == true/false) 
{
  // do somthing
}
else
{
  // do something else
}
Run Code Online (Sandbox Code Playgroud)

但我也看到过相反的人:

if(true/false == Class.HasSomething())
{
  // do somthing
}
else
{
  // do something else
}
Run Code Online (Sandbox Code Playgroud)

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

MCa*_*tle 14

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

if(Class.HasSomething())
{
  // do something
}
else
{
  // do something else
}
Run Code Online (Sandbox Code Playgroud)

......为了简单起见.


abe*_*nky 10

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

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

虽然这个错误将不再在C#中编译,但旧习惯很难,很多程序员都坚持使用C语言开发的风格.


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

if (Foo()) { ... }  
Run Code Online (Sandbox Code Playgroud)

但对于虚假陈述,我喜欢明确的比较.
如果我写的较短!Foo(),那么!以后查看代码时很容易过度查看.

if (false == Foo()) { ... }  /* Obvious intent */
if (!Foo())  { ... }         /* Easy to overlook or misunderstand */
Run Code Online (Sandbox Code Playgroud)


Kei*_*thS 5

第二个例子就是我所说的"尤达条件"; "假的,这个方法的返回值必须是".这不是你用英语说的方式,所以说英语的程序员通常都会看不起.

在性能方面,确实没有区别.第一个例子通常在语法上更好(因此是为了可读性),但是考虑到你的方法的名称,所涉及的"语法"(以及你将bool与bool进行比较的事实)无论如何都会使等式检查变得多余.所以,对于一个真实的陈述,我只想写:

if(Class.HasSomething()) 
{
  // do somthing
}
else
{
  // do something else
}
Run Code Online (Sandbox Code Playgroud)

这将逐渐加快,因为if()块基本上具有内置的相等比较,因此如果您编写if(Class.HasSomething() == true)CLR将进行评估if((Class.HasSomething() == true) == true).但是,我们在这里谈论的可能是几个时钟的增益(不是毫秒,不是刻度,而是时钟;在现代处理器中每秒钟发生20亿次).

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

  • 不回答表现问题. (2认同)