以下代码在调试和发布模式下生成不同的异常堆栈跟踪:
static class ET
{
public static void E1()
{
throw new Exception("E1");
}
public static void E2()
{
try
{
E1();
}
catch (Exception e)
{
throw;
}
}
public static void Entry()
{
try
{
E2();
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
}
}
}
调试模式的结果:
在ET.E1()的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第47行
在ET:E2()中的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第58行
在ET.Entry()中的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第68行
发布模式中的结果:
在ET:E2()中的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第55行
在ET.Entry()中的D:\ myStudio \ CSharp \ CSharp4.0 \ MyCSharp \ ExceptionHandling.cs:第68行
请注意,缺少发布模式中结果的第一行。如何在发布模式下返回违规行。
答案 0 :(得分:15)
您可能会看到inlining的结果。在调试模式下编译时,内联始终处于关闭状态(因此调试很有意义)。在发布模式下编译时,编译器将删除某些方法(受a lot of rules限制)并将其内容插入所有调用站点。这通过删除方法调用开销来提高这些方法的整体性能。