这是最佳实践: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
}
在性能和速度方面做一个或另一个有什么优势吗?我不是在谈论这里的编码风格。
它们都是等效的,但我的偏好是
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# 中,此类语句仅在变量为布尔值时才有效,这减少了执行此操作的需要。