我记得曾经读过一次评估成员的顺序很重要.如
if (null == myClass)
Run Code Online (Sandbox Code Playgroud)
那么更好(更快?)
if (myClass == null)
Run Code Online (Sandbox Code Playgroud)
是这样的吗?如果有,有人可以解释如何以及为什么?如果答案需要一种语言,则瞄准c#.
谢谢
dri*_*iAn 24
不,它不快.这是旧C天的遗物,它避免了像虫这样的虫子
if(myClass = null) /* accident, sets myClass to null instead of comparing */
Run Code Online (Sandbox Code Playgroud)
所以你总是在左边有常数:
if(null = myClass) /* throws an error at compile time */
Run Code Online (Sandbox Code Playgroud)
但是在C#中这样做是没有意义的我相信..
它并不快,因为需要评估==符号的两侧.如果您有多个条件,则适用短路规则.
一个接一个地评估条件,直到达到确定的答案并且直到那时为止.
所以,如果你有
if ((a != null) && (someLongCheck()) ...
Run Code Online (Sandbox Code Playgroud)
并且a为null然后someLongCheck()将不会被调用.
嗯,这完全取决于语言和编译器.使用框架附带的C#编译器并不重要,因为IL输出是相同的.这是一个示例例程:
static void Main(string[] args)
{
// Create the instance.
MyClass instance = new MyClass();
if (null == instance)
{
}
if (instance == null)
{
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
第二个:
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
Run Code Online (Sandbox Code Playgroud)
如您所见,除了堆栈上项目的排序外,输出几乎完全相同.操作是一样的.
如前所述,它是旧C天的遗物,其中0值的任何值都被评估为false,如果您错过了等号,则赋值被评估为条件.
您不必担心在.NET中,因为条件只接受布尔值,但如果您要与true/false进行比较,那么将字面值放在第一位可能仍然是更好的编码习惯,以免意外评估作业.
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |