如果在发布版本中内联给定的方法或属性getter,我有什么方法可以检查(而不是强制)?
答案 0 :(得分:7)
不 - 因为它不会在构建时发生;它发生在JIT时间。 C#编译器不会执行任何内联;这取决于代码最终运行的CLR。
可以使用cordbg发现这一点,并且所有JIT优化都已启用,但您需要深入了解汇编代码。我不知道在代码中发现这种情况的方法。 (您可以使用调试器API执行此操作,但这可能会禁用一些内联开始。)
答案 1 :(得分:5)
它们永远不会被C#编译器内联。只有const
个字段。
您可以查看C#编译器优化here。
你可以确保方法或属性访问者从不内联,并且应用了此属性:
[MethodImpl(MethodImplOptions.NoInlining)]
答案 2 :(得分:3)
您必须查看机器代码。在方法调用上设置断点,当它命中时,右键单击并选择Go To Assembly。如果您没有看到CALL语句,那么它就会被内联。你必须要在读取机器代码时加快速度才能确定,你可能会看到内联方法中的调用。
为了使其准确,您必须使用工具+选项,调试,常规,取消勾选“在模块加载时抑制JIT优化”。这样可以确保抖动在没有调试器的情况下运行,优化器关闭时不会内联方法。
答案 3 :(得分:1)
在方法体中添加代码以使用StackFrame
检查堆栈跟踪。根据我的经验,内联方法被排除在此堆栈跟踪之外。
答案 4 :(得分:1)
我知道这篇文章相当陈旧,但您可以打印出调用该函数的堆栈以及您自己调用的函数。
如果打印出的堆栈匹配,您可以确定该函数是内联的。
要打印堆叠,您可以使用System.Environment.StackTrace
或VS Varibles $caller
和$callstack
(https://msdn.microsoft.com/en-us/library/5557y8b4.aspx#BKMK_Print_to_the_Output_window_with_tracepoints)
答案 5 :(得分:0)