如果在if语句后不使用花括号,该怎么办?喜欢: -
if(SomeCondition())
return true;
而不是
if(SomeCondition())
{
return true;
}
在编译时间,更好的IL代码生成,获得更少的空间或任何其他方面(此时我真的无法想到)中,它真的有助于编译器吗?想知道它真的有用还是只是代码可读性?
答案 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;