【发布时间】:2014-10-14 16:16:39
【问题描述】:
我希望MyMethod 的以下两个实现的行为完全相同相同。他们有吗?如果不是,这可能已经是我的错误假设了:
第一:
public int MyMethod(int x)
{
try
{
return x + 8;
}
catch
{
throw;
}
}
第二:
public int MyMethod(int x)
{
return x + 8;
}
因此,我假设编译器会对此进行优化,即删除第一个实现的不必要的 try/catch 块(在发布模式下)。 事实证明,它没有 - 这是为两个代码示例生成的 IL:
第一:
.method public hidebysig instance int32 MyMethod(int32 x) cil managed
{
// Code size 11 (0xb)
.maxstack 2
.locals init ([0] int32 CS$1$0000)
.try
{
IL_0000: ldarg.1
IL_0001: ldc.i4.8
IL_0002: add
IL_0003: stloc.0
IL_0004: leave.s IL_0009
} // end .try
catch [mscorlib]System.Object
{
IL_0006: pop
IL_0007: rethrow
} // end handler
IL_0009: ldloc.0
IL_000a: ret
} // end of method MyClass::MyMethod
第二:
.method public hidebysig instance int32 MyMethod(int32 x) cil managed
{
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldc.i4.8
IL_0002: add
IL_0003: ret
} // end of method MyClass::MyMethod
有人可以解释一下吗?两种实现的行为是否存在相关差异(副作用?)?编译器可以优化代码,但不能吗?谢谢!
【问题讨论】:
-
您认为它没有任何副作用的假设是错误的。它确实,相当大的一个,该方法不会被内联。很好在this question 中展示。对于不做任何事情的 for() 循环也是如此。不会被删除,因为它确实有副作用,需要时间。编译器和抖动只优化不明显的情况。
-
x + 8在特定条件下可能会失败。 OP 练习:弄清楚这是如何发生的 :)
标签: c# try-catch compiler-optimization