在c#中,您说明条件的顺序的执行速度是否有任何差异?
if (null != variable) ... if (variable != null) ...
从最近开始,我经常看到第一个,因为我习惯了第二个,所以引起了我的注意.
如果没有差异,第一个的优势是什么?
它是来自C的保留.在C中,如果你使用了一个糟糕的编译器或没有足够高的警告,这将编译时没有任何警告(并且确实是合法的代码):
// Probably wrong if (x = 5)
当你真的可能意味着
if (x == 5)
您可以通过以下方式在C中解决此问题:
if (5 == x)
这里的拼写错误会导致代码无效.
现在,在C#中,这都是piffle.除非你比较两个布尔值(很少见,IME),否则你可以编写更易读的代码,因为"if"语句需要一个布尔表达式来开始,而" x=5
" 的类型Int32
不是Boolean
.
我建议如果你在同事的代码中看到这一点,你就会用现代语言教育他们,并建议他们将来写出更自然的形式.
有一个很好的理由首先使用null: if(null == myDuck)
如果class Duck
覆盖==
运算符,则if(myDuck == null)
可以进入无限循环.
使用null
首先使用默认的相等比较器和实际上做你打算什么.
(我听说你习惯于阅读那种最终编写的代码 - 我还没有经历过那种转变).
这是一个例子:
public class myDuck { public int quacks; static override bool operator ==(myDuck a, myDuck b) { // these will overflow the stack - because the a==null reenters this function from the top again if (a == null && b == null) return true; if (a == null || b == null) return false; // these wont loop if (null == a && null == b) return true; if (null == a || null == b) return false; return a.quacks == b.quacks; // this goes to the integer comparison } }
就像每个人都已经注意到它会或多或少地来自C语言,如果你不小心忘记了第二个等号,你可能会得到错误的代码.但是还有另一个原因也与C#相匹配:可读性.
举个简单的例子:
if(someVariableThatShouldBeChecked != null && anotherOne != null && justAnotherCheckThatIsNeededForTestingNullity != null && allTheseChecksAreReallyBoring != null && thereSeemsToBeADesignFlawIfSoManyChecksAreNeeded != null) { // ToDo: Everything is checked, do something... }
如果您只是将所有空单词交换到开头,您可以更容易地发现所有检查:
if(null != someVariableThatShouldBeChecked && null != anotherOne && null != justAnotherCheckThatIsNeededForTestingNullity && null != allTheseChecksAreReallyBoring && null != thereSeemsToBeADesignFlawIfSoManyChecksAreNeeded) { // ToDo: Everything is checked, do something... }
所以这个例子可能是一个不好的例子(参考编码指南),但想想你快速滚动一个完整的代码文件.通过简单地看到模式
if(null ...
你马上就会知道接下来会发生什么.
如果它是相反的方式,你总是要扫描到行的末尾以查看无效检查,只是让你绊倒一秒钟,找出那里做了什么样的检查.因此,语法突出显示可能会对您有所帮助,但是当这些关键字位于行尾而不是前端时,您总是会变慢.
我想这是一个已经切换语言的C程序员.
在C中,您可以编写以下内容:
int i = 0; if (i = 1) { ... }
注意在那里使用单个等号,这意味着代码将1分配给变量i,然后返回1(赋值是表达式),并在if语句中使用1,它将被处理为true.换句话说,以上是一个错误.
但是在C#中,这是不可能的.两者之间确实没有区别.