【问题标题】:What compiler make with try-catch block编译器用 try-catch 块做什么
【发布时间】:2012-11-26 18:38:14
【问题描述】:

我想知道 CSC 编译器用 TRY-CATCH 块做了什么。例如,编译器将如何处理如下代码?
在编译为 MSIL 之前,编译器会将基本代码更改为其他形式的 C# 代码吗?我可以预览此代码吗?使用 TRY-CATCH 块的编译器规则是什么?

try
{
    int x =45;
    var obj = new MyObject(++x);
    obj.MyMethod(1234, "qwerty");
    short result = x / obj.Function(x);
}
catch(Exception ex)
{
    Console.Writeline(@"Something goes wrong :/");
}

【问题讨论】:

  • 您是否尝试编译代码然后在其上使用 ildasm?请阅读tinyurl.com/so-list
  • ildasm.exe 将显示我的 MSIL 代码,我想看看编译器如何更改此代码
  • “为另一个 C#”是什么意思?编译器的重点是将 C# 转换为 MSIL... 为什么您期望 try/catch 可以在 C# 中以不包括 try/catch 的另一种形式表示?
  • 是什么让您对优化有这样的想法?编译器很少有理由将 C# 转换为 C#...查询表达式会浮现在脑海中,但其他方面则不多。
  • @Jacek,您的问题中已经有了“最终编译为 MSIL 的代码”。内部编译器并不将代码表示为 C#,它只是某种抽象语法树......您可能会问编译器是如何工作的,但它会偏离主题(正如“龙书”所写的那样)。

标签: c# .net exception compiler-construction


【解决方案1】:
【解决方案2】:

请看这里:http://weblogs.asp.net/kennykerr/archive/2004/09/15/230167.aspx

在 IL 中的 try-catch 块实际上看起来与在源代码中的非常相似。 IL 的具体内容取决于您在源代码中指定的内容;有几个构造,例如 .fault(类似于 finally,但仅在抛出异常时执行),它们没有 C#/VB 等效项,但编译器仍然可以识别“常见”错误处理行代码并将它们放在一个 .fault 块中。

【讨论】:

    【解决方案3】:

    try-catch 是一个在编译时被完全分析的概念,因此在运行时不会有很大的影响。

    请查看此link。它肯定会帮助你。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 2011-01-01
      相关资源
      最近更新 更多