我刚刚在一些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)
这意外地分配1给i而不是进行比较.
撤销检查中的顺序可以防止出现这种常见错误.
if (1 = i) {
}
Run Code Online (Sandbox Code Playgroud)
那将无法编译,很容易看到你错误地键入=而不是==.
这bools在C#中仍然相关,因为赋值的值是指定的值.
为此:
if (SomeBoolVar = true) {
}
Run Code Online (Sandbox Code Playgroud)
因为你是存储将永远是真正true为SomeBoolVar它的值应该true.一个可能难以追查的小错误.
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#代码.
因为程序员:-)的布尔条件的整点的小丑是,你命名它们使得它们的意义是布尔值:
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)
等等,无限的.
使用恒定的第一,以避免意外使用的问题的全部诀窍=转让,而不是==平等不应该是一个问题在这里,因为你不应该检查对一个布尔值true或false.你应该使用以下之一:
if (cond)
if (!cond)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1825 次 |
| 最近记录: |