.NET CLR运行时是否知道如何在运行时优化/内联简单属性getter?例如:
property int Length { get; set; }
Run Code Online (Sandbox Code Playgroud)
一旦在运行时进行JIT,它会执行"Length__get"函数(为它构建堆栈,跳转执行代码等)吗?或者抖动是否聪明,并且知道这可以被重写为类字段访问?
Jon*_*eet 13
是的,CLR将在"正常"情况下进行内联.但是在某些情况下,内联不会发生 - 包括从中派生的任何内容MarshalByRefObject(因为它可能是运行时代理).
内联内容的规则取决于你正在使用的确切CLR - x64 vs x86,版本等.尽管你会得到简单的内容属性很可能:)
(出于某种原因,我看到一个简单的属性比过去的双打字段访问要慢......对于大于本机字大小的值,可能存在一些限制.)
在.Net 2.0中,如果方法(包括属性getter/setter)少于32个字节,则会内联它们.
.Net 3.5 JIT'r更加智能,所以它取决于它.它可以内联它.
有关此问题的一些讨论,请参阅内联或不内联:这是问题所在.