我记得曾经读过一次评估成员的顺序很重要.如
if (null == myClass)
那么更好(更快?)
if (myClass == null)
是这样的吗?如果有,有人可以解释如何以及为什么?如果答案需要一种语言,则瞄准c#.
谢谢
不,它不快.这是旧C天的遗物,它避免了像虫这样的虫子
if(myClass = null) /* accident, sets myClass to null instead of comparing */
所以你总是在左边有常数:
if(null = myClass) /* throws an error at compile time */
但是在C#中这样做是没有意义的我相信..
它并不快,因为需要评估==符号的两侧.如果您有多个条件,则适用短路规则.
一个接一个地评估条件,直到达到确定的答案并且直到那时为止.
所以,如果你有
if ((a != null) && (someLongCheck()) ...
并且a为null然后someLongCheck()
将不会被调用.
嗯,这完全取决于语言和编译器.使用框架附带的C#编译器并不重要,因为IL输出是相同的.这是一个示例例程:
static void Main(string[] args) { // Create the instance. MyClass instance = new MyClass(); if (null == instance) { } if (instance == null) { } }
IL的第一次比较如下:
L_0007: ldnull L_0008: ldloc.0 L_0009: ceq L_000b: ldc.i4.0 L_000c: ceq L_000e: stloc.1 L_000f: ldloc.1 L_0010: brtrue.s L_0014 L_0012: nop L_0013: nop
第二个:
L_0014: ldloc.0 L_0015: ldnull L_0016: ceq L_0018: ldc.i4.0 L_0019: ceq L_001b: stloc.1 L_001c: ldloc.1 L_001d: brtrue.s L_0021 L_001f: nop L_0020: nop
如您所见,除了堆栈上项目的排序外,输出几乎完全相同.操作是一样的.
如前所述,它是旧C天的遗物,其中0值的任何值都被评估为false,如果您错过了等号,则赋值被评估为条件.
您不必担心在.NET中,因为条件只接受布尔值,但如果您要与true/false进行比较,那么将字面值放在第一位可能仍然是更好的编码习惯,以免意外评估作业.