C#if语句.内部运作问题

Mik*_*ell 13 c#

我刚刚在一些Exchange 2010代码中遇到过这段代码片段,我想知道是否有人知道程序员为什么这样做了.我从未见过像这样格式化的If语句.它看起来如此倒退必定有一个很好的理由吗?

if (true == MsgItem.HasAttachments)
{
    // Code
}
Run Code Online (Sandbox Code Playgroud)

我假设它可能会对编码相同内容的各种其他方式进行一些优化;

if (MsgItem.HasAttachments) 
{
    // Code
}
Run Code Online (Sandbox Code Playgroud)

要么

if (MsgItem.HasAttachments == true)
{
    // Code
}
Run Code Online (Sandbox Code Playgroud)

这不是什么大不了我只是好奇.

谢谢,迈克

更新:感谢所有有趣的观点.摘要似乎归结为传统编码标准.

jjn*_*guy 31

这是C或C++的遗留习惯,您可能会意外地做到这一点:

if (i = 1) {
}
Run Code Online (Sandbox Code Playgroud)

这意外地分配1i而不是进行比较.

撤销检查中的顺序可以防止出现这种常见错误.

if (1 = i) {
}
Run Code Online (Sandbox Code Playgroud)

那将无法编译,很容易看到你错误地键入=而不是==.

bools在C#中仍然相关,因为赋值的值是指定的值.

为此:

if (SomeBoolVar = true) {
}
Run Code Online (Sandbox Code Playgroud)

因为你是存储将永远是真正trueSomeBoolVar它的值应该true.一个可能难以追查的小错误.

  • 使用`if(SomeBoolVar = true)`而不是`if(SomeBoolVar)`的人应该切断他们的手:-) (14认同)
  • 如果在条件表达式中意外使用`=`而不是`==',Microsoft的C#编译器也会发出警告. (3认同)

Jon*_*eet 14

C++和C程序员有时会将常量放在第一位,以避免意外写入

if (variable = constant)
Run Code Online (Sandbox Code Playgroud)

哪个会执行任务.

特别是,显式的布尔比较,假设HasAttachments是可写的,这个语句将编译并运行,没有警告1,但在C#中没有预期的行为:

if (MsgItem.HasAttachments = true)
Run Code Online (Sandbox Code Playgroud)

对于非布尔表达式,这通常不是C#中的问题,因为if语句的条件必须可以隐式转换为bool...而对于布尔表达式,您的中间格式无论如何都是首选:

if (MsgItem.HasAttachments)
Run Code Online (Sandbox Code Playgroud)

如果它对性能有任何影响我会感到惊讶- 并且可能对生成的IL没有任何影响.


1糟糕 - MS C#编译器确实警告过:

警告CS0665:条件表达式中的赋值始终是常量; 你的意思是使用==而不是=?

我没有在Mono下试过它; 可能会也可能不会发出警告.它肯定是有效的 C#代码.


Jus*_*ier 11

这些被称为" Yoda条件 " - 最初的想法是,如果您不小心输入单个=,编译将失败,因为常量值在左侧.


pax*_*blo 6

因为程序员:-)的布尔条件的整点的小丑是,你命名它们使得它们的意义是布尔值:

if (MsgItem.HasAttachments)
Run Code Online (Sandbox Code Playgroud)

这显然是这样,我不知道为什么编码员通过测试平等对抗自己true.

因为,严肃地说,true == MsgItem.HasAttachments只是另一个布尔值,所以你在哪里停止?

if (true == MsgItem.HasAttachments)
if (true == (true == MsgItem.HasAttachments))
if (true == (true == (true == MsgItem.HasAttachments)))
: : :
Run Code Online (Sandbox Code Playgroud)

等等,无限的.

使用恒定的第一,以避免意外使用的问题的全部诀窍=转让,而不是==平等不应该是一个问题在这里,因为你不应该检查对一个布尔值truefalse.你应该使用以下之一:

if (cond)
if (!cond)
Run Code Online (Sandbox Code Playgroud)