gpt4 book ai didi

c# - 终于理解try catch的MSIL

转载 作者:太空狗 更新时间:2023-10-29 18:22:01 24 4
gpt4 key购买 nike

我有以下代码

    using System;

class Pankaj
{
public static int Main()
{
int returnValue=0;
try
{
return returnValue;
throw new Exception();

}
catch(Exception ex){
return returnValue;
}
finally
{
returnValue++;
}
return returnValue;
}
}

上述代码生成的 MSIL 是:

.method public hidebysig static int32  Main() cil managed
{
.entrypoint
// Code size 18 (0x12)
.maxstack 2
.locals init (int32 V_0,
int32 V_1)
IL_0000: ldc.i4.0
IL_0001: stloc.0
.try
{
.try
{
IL_0002: ldloc.0
IL_0003: stloc.1
IL_0004: leave.s IL_0010
} // end .try
catch [mscorlib]System.Exception
{
IL_0006: pop
IL_0007: ldloc.0
IL_0008: stloc.1
IL_0009: leave.s IL_0010
} // end handler
} // end .try
finally
{
IL_000b: ldloc.0
IL_000c: ldc.i4.1
IL_000d: add
IL_000e: stloc.0
IL_000f: endfinally
} // end handler
IL_0010: ldloc.1
IL_0011: ret
} // end of method Pankaj::Main

我有以下问题:

  1. 为什么 try catch 再次包含在 try block 中。
  2. 看起来 leave.s try 和 catch block 中的最后一行指向 finally 即 IL_0010但是在 IL_0010 行它的 ldloc.1 我认为这意味着在堆栈上加载局部变量 1,然后它指向 finally block 。是不是类似于位置 1 我们有 finally block 的地址。
  3. 如果我从 catch block 中抛出或返回一些东西,那么调用语句怎么会落到 finally block ,它已经从 catch block 返回,但 finally block 仍然被执行。

最佳答案

Why the try catch is again included inside the try block.

不确定这个。这可能就是ildasm的方式选择反编译它。 ECMA-335 表示对 SEHClause 的方式有限制可以在 TryBlock 之后指定元素,但我还没有找到这些限制。

It looks like leave.s the last line in try and catch block is point to finally i.e. IL_0010 but at line IL_0010 its ldloc.1 which I believe means load local variable 1 on the stack, then how its pointing to finally block. Is it something like at location 1 we have address of finally block.

不,那是跳到 之后 finally block - 有效地返回值。您有 很多 的 return 语句都返回相同的东西以及无法访问的代码,这对您没有帮助,但我相信重点基本上只是移动 ret外面trycatch .我认为编译器有效地为返回值设置了一个额外的局部变量。

If I throw or return something from the catch block then how come the call statement falls to the finally block, it's already returned from the catch block but still the finally block gets executed.

这就是 C# 和 IL 的定义方式 - finally block 将被执行但是你退出 block 。

关于c# - 终于理解try catch的MSIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27601747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com