我一直在写:
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() == 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 条件”,因为如果你不小心使用了单等号,你会得到一个关于赋值给常量的编译时错误:
if (true = Foo()) { ... } /* Compile time error! Stops typo-mistakes */
if (Foo() = true) { ... } /* Will actually compile for certain Foo() */
尽管这个错误在 C# 中不再编译,但旧习惯很难改掉,许多程序员仍坚持用 C 开发的风格。
就个人而言,我喜欢 True 语句的非常简单的形式:
if (Foo()) { ... }
但对于 False 陈述,我喜欢明确的比较。
如果我写的更短,以后在查看代码时!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 亿次的时钟)。
对于 false 条件,在使用 not 运算符:if(!Class.HasSomething())
和使用与 false: 的比较之间是一个折腾if(Class.HasSomething() == false)
。第一个更简洁,但很容易错过复杂表达式中的那个小感叹号(特别是因为它出现在整个表达式之前),所以我会考虑将其等同于 false 以确保代码可读。
您不会看到任何性能差异。
正确的选项是
if (Whatever())
唯一应该写== false
or!= true
是在处理bool?
s 时。(在这种情况下,所有四个选项都有不同的含义)
您不会看到任何性能差异,任何比较都被转换为相同的 IL...
if(Class.HasSomething())
{
// do somthing
}
是我的方式。但最好尽量避免HasSomething()
. 更好地公开返回值一次并重用它。
你不应该写。
写
if(Class.HasSomething())
{
// do something
}
else
{
// do something else
}
反而。如果Class.HasSomething()
已经是一个布尔值,那么将它与另一个布尔值进行比较是没有意义的
这里没有性能优势。这种编码风格用于防止程序员键入 = 而不是 == 的情况。编译器会解决这个问题,因为 true/false 是常量,不能分配新值
对于布尔值,我不建议:只使用if (method())
and if (!method())
。对于布尔值以外的情况,使用 yoda-speak 的约定,例如,if (1 == x)
是为了防止错误,因为if (1 = x)
会抛出编译器错误而if (x = 1)
不会(它是 C 中的有效代码,但可能不是你想要的)。在 C# 中,只有当变量是布尔值时,这样的语句才有效,从而减少了这样做的需要。