繁体   English   中英

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

[英]Which is the best practices: MethodReturnsBoolean == true/false OR true/false == MethodReturnsBoolean

我一直在写:

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

但我也看到过相反的人:

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

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

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

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

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

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

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

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

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

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

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

对于错误的条件,使用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()已经是bool,那么将它与另一个布尔值进行比较是没有意义的

这里没有优势。 这种编码风格用于防止程序员类型=而不是==的情况。 编译器将使用cathc,因为true / false是常量,不能赋予新值

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM