我一直在写:
if(Class.HasSomething() == true/false)
{
// do somthing
}
else
{
// do something else
}
但我也看到过相反的人:
if(true/false == Class.HasSomething())
{
// do somthing
}
else
{
// do something else
}
在性能和速度方面做一个或另一个有什么优势吗?我不是在谈论编码风格。
答案 0 :(得分:14)
它们都是等价的,但我的偏好是
if(Class.HasSomething())
{
// do something
}
else
{
// do something else
}
...为了简单起见。
答案 1 :(得分:10)
某些老式的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()) { ... }
但对于虚假陈述,我喜欢明确的比较
如果我写下较短的!Foo()
,则稍后查看代码时很容易过度查看!
。
if (false == Foo()) { ... } /* Obvious intent */
if (!Foo()) { ... } /* Easy to overlook or misunderstand */
答案 2 :(得分:5)
第二个例子就是我所说的“尤达条件”; “假的,这个方法的返回值必须是”。这不是你用英语说的方式,所以说英语的程序员通常都会看不起。
在性能方面,确实没有区别。第一个例子通常在语法上更好(因此是为了可读性),但是考虑到你的方法的名称,所涉及的“语法”(以及你将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以确保代码可读。
答案 3 :(得分:1)
您不会看到任何性能差异。
正确的选项是
if (Whatever())
在处理== false
时,唯一应该写!= true
或bool?
的时间。 (在这种情况下,所有四个选项都有不同的含义)
答案 4 :(得分:1)
您不会看到任何性能差异,或者比较被转换为相同的IL ...
答案 5 :(得分:1)
if(Class.HasSomething())
{
// do somthing
}
是我的方式。但最好尽量避免HasSomething()
的多方法调用。更好地公开返回值一次并重复使用它。
答案 6 :(得分:1)
你不应该写。
写
if(Class.HasSomething())
{
// do something
}
else
{
// do something else
}
代替。如果Class.HasSomething()
已经是bool,那么将它与另一个布尔值
答案 7 :(得分:0)
这里没有优势。这种编码风格用于防止程序员类型=而不是==的情况。编译器将使用cathc,因为true / false是常量,不能分配新值
答案 8 :(得分:0)
对于布尔值的情况,我建议不要:只使用if (method())
和if (!method())
。对于除了布尔语之外的事物,使用yoda-speak的惯例,例如if (1 == x)
来防止错误,因为if (1 = x)
会抛出编译器错误而if (x = 1)
不会(它是C中的有效代码,但可能不是你想要的)。在C#中,这样的语句只有在变量是布尔值时才有效,这样就不需要这样做了。