C#内联属性吗?

C#内联访问属性吗? 我知道内联的JIT有32字节(指令?)限制,但它是内联属性还是只是方法调用?

这取决于JIT(据我所知,C#编译器没有进行任何内联),但我相信JIT会在大多数情况下内联琐碎的属性。

请注意,它不会内联从MarshalByRefObject派生的类型的成员,其中包括System.Windows.Forms.Control (通过System.ComponentModel.Component )。

我也看到double字段在通过属性访问时最终效率较低 – 可能是因为存在一些细微之处(由于寄存器使用等)。

另请注意,64位和32位JIT是不同的,包括它们对内联的处理。

编辑:我刚刚发现David Notario在2004年的博客文章中提供了更多信息。 然而,那是在2.0发货之前 – 我不会惊讶地发现现在至少有一些已经改变了。 无论如何,可能会有兴趣。

编辑: 另一个问题涉及2008年Vance Morrison博客文章 ,该文章提供了更多信息。 有趣的东西。

属性访问只是一个纯方法调用。 编译器为属性访问和具有类似签名的方法调用发出的IL没有区别,这可以回答您的问题。

我花了一段时间才弄清楚,在Visual Studio中,您可以在JIT编译查看托管代码的反汇编。

那么为什么不创建一个具有非常简单的访问器属性的类,在发布模式下运行它,设置一个断点,看看反汇编说的是什么?

我最近发布了一个类似的问题:

为什么公共领域比属性更快?

我的问题是公共字段比属性更快,因为我正在运行64位Vista,而JIT也将我的代码编译为64位,而且我的属性没有内联。 强制项目为x86编译在内联属性,并且属性和公共字段之间没有速度差异。

因此,C#32位JIT执行内联属性,64位不执行,也不执行任何其他非静态方法。