放少量花括号真的有帮助吗?

时间:2014-06-06 10:48:06

标签: c# optimization compiler-construction clr

如果在if语句后不使用花括号,该怎么办?喜欢: -

if(SomeCondition())
    return true;

而不是

if(SomeCondition())
{
  return true;
}

在编译时间,更好的IL代码生成,获得更少的空间或任何其他方面(此时我真的无法想到)中,它真的有助于编译器吗?想知道它真的有用还是只是代码可读性?

4 个答案:

答案 0 :(得分:2)

他们也这样做。
如果您处于调试模式(感谢Dirk),MSIL代码在两种情况下几乎相同。
在发布模式下,MSIL将是相同的。

这是一个linqpad示例(调试模式):

例1:
C#:

void Main()
{
    bool a = true;
    int i;
    if(a)
     i = 17;  
}

IL:

IL_0001:  ldc.i4.1    
IL_0002:  stloc.0     // a
IL_0003:  ldloc.0     // a
IL_0004:  ldc.i4.0    
IL_0005:  ceq         
IL_0007:  stloc.2     // CS$4$0000
IL_0008:  ldloc.2     // CS$4$0000
IL_0009:  brtrue.s    IL_000E
IL_000B:  ldc.i4.s    11 
IL_000D:  stloc.1     // i

例2:

C#:

void Main()
{
    bool a = true;
    int i;
    if(a)
    {
     i = 17;  
    }
}

IL:

IL_0001:  ldc.i4.1    
IL_0002:  stloc.0     // a
IL_0003:  ldloc.0     // a
IL_0004:  ldc.i4.0    
IL_0005:  ceq         
IL_0007:  stloc.2     // CS$4$0000
IL_0008:  ldloc.2     // CS$4$0000
IL_0009:  brtrue.s    IL_0010
IL_000B:  nop         
IL_000C:  ldc.i4.s    11 
IL_000E:  stloc.1     // i

答案 1 :(得分:1)

生成的代码完全没有区别,至少在发布模式下没有。在调试模式下,可能会添加更多nop指令,因此每行至少有一条指令,以便在调试代码时单步执行这些指令。

编译时间自然存在差异,因为代码不相同。但是,这种差异是如此之小,以至于您甚至可以注意到差异之前需要拥有数百万行代码。

您应该使用使代码更易于维护的那个。如果你的代码风格导致你犯了一个错误,那么修复一个错误所需的时间比你在编译时节省的总时间要长。


就个人而言,我更喜欢在那里总是有括号,即使代码块中只有一个语句。如果代码遵循单一模式而不是两种不同模式,则更容易阅读代码。

答案 2 :(得分:0)

技术上你是对的,因为工具链的词法分析器部分不需要解析那些额外的令牌,但差别是几个CPU周期,所以你不会注意到这一点,我建议总是使用大括号。 / p>

编辑:正如其他人指出:代码将是相同的。如果您阅读C#的语法规范(以及其他一些语言,如C,C ++,Java),那么您将看到if条件后跟statement,而不是几个语句。为了能够为if条件写几个语句,你需要花括号。 当您在返回之前另外记录某些内容或做某事时,您将被迫使用大括号。

对于您的情况,MSIL代码IMHO may看起来相同,但不保证这一点。因为只要编译器感觉如此,编译器就可以自由地添加NOP IL命令。但是,代码的语义不会改变。

长话短说:您的样本在语义上是等效的。

答案 3 :(得分:0)

它们在编译时间方面都是等价的。这真的归结为个人偏好的问题。一般来说,我喜欢包括除返回语句之外的所有内容,即 if(condition) { do something } else return x;