c# - 已内联的函数的堆栈跟踪是否在抛出的异常中保留?

标签 c# .net exception inline

Release 模式下编译可执行文件时 - 启用代码优化 - 编译器可能会选择内联满足特定条件的函数以提高性能。

我的问题是:当一个已经被内联的函数体抛出异常时,stacktrace信息是否会被保留而不考虑内联展开?也就是说,会不会显示原始函数作为错误源,还是会显示调用函数?

最佳答案

这取决于抛出异常的方式。如果你使用 throw 语句那么你没有问题,抖动不会内联包含 throw 的方法。顺便说一句,当您需要快速设置属性时需要注意一些事情。

但是,如果异常是由正常执行引起的,例如 NullReferenceException 或 IndexOutOfRangeException 等,那么是的,如果方法是内联的,您不会在堆栈跟踪中看到它的名称。这可能有点令人困惑,但您通常可以从调用方法的源代码和异常类型中弄清楚。希望它相对较小。 [MethodImpl(MethodImplOptions.NoInlining)] 属性可用于抑制内联。当您发现它会有帮助时,通常为时已晚;)

关于c# - 已内联的函数的堆栈跟踪是否在抛出的异常中保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17225169/

相关文章:

c# - Asp.net 路径压缩

c# - Mode=TwoWay 返回 Null

java - 使用 EMV 芯片读取信用卡并将数据写入基于 Web 浏览器的 POS 屏幕

c# - 从 .NET 连接到 LDAP 服务器

.net - 有人可以简单解释一下如何使用 Threading.MemoryBarrier 在 .Net 中实现 'Full Fences' 吗?

.net - C :\Windows\assembly and C:\Windows\Microsoft. NET\assembly 目录有什么区别?

java - Hibernate:非空属性引用空值或 transient 值

c# - 如何抑制 StyleCop 警告 "SA1201: All methods must be placed after all properties."?

bash - perl 脚本结束时会发生什么?

c# - 将 MySQL double 导入到 C# 时出现 InvalidCastException