我在XNA中玩弄,看到Vector3类使用公共字段而不是属性。 我尝试了一个快速的基准,发现对于一个struct的差异是相当戏剧性的(将两个向量加在一起,一亿次带有属性的2.0s和带有字段的1.4s)。 对于一个参考types,差异似乎并不大,但它在那里。 那么为什么呢? 我知道一个属性被编译成get_X和set_X方法,这会招致方法调用的开销。 但是,这些简单的getter / setter是不是总是被JIT内联? 我知道你不能保证JIT决定做什么,但是肯定这个概率是相当高的? 还有什么是在机器层面上将公共领域与财产分开的? 还有一件事我一直在想:一个自动实现的属性( public int Foo { get; set; } )如何比公共领域更好的OOdevise? 或者更好地说:这两个不同呢? 我知道,使它成为一个财产更容易与反思,但别的? 我敢打赌,这两个问题的答案是一样的。 顺便说一句:我正在使用的.NET 3.5 SP1,我相信固定的问题结构的方法(或结构的方法,我不知道)没有内衬,所以不是这样。 我想我至less使用它,这是肯定安装,但是,然后再次,我使用Vista的64位与SP1应该有DX10.1,除了我没有DX10.1 .. 另外:是的,我一直在运行发布版本:) 编辑 :我很欣赏快速答案的家伙,但我表示,我知道一个属性访问是一个方法调用,但我不知道为什么,可能是内联方法比直接字段访问速度慢。 编辑2 :所以我创build了另一个使用显式GetX()方法的结构(o我怎么不会错过我的Java日子),并执行相同的是否我禁用内联(通过[MethodImplAttribute(MethodImplOptions.NoInlining)] )或不,所以结论:非静态方法显然不是内联的,甚至不在结构上。 我认为有些例外,JIT可以优化虚拟方法。 为什么不能在不知道inheritance的结构上发生,因此方法调用只能指向一种可能的方法,对吗? 或者是因为你可以实现一个接口吗? 这真是一种耻辱,因为它真的会让我思考如何在性能关键的东西上使用属性,但是使用字段会让我感到肮脏,所以我不妨写下我在C中所做的事情。 编辑3 :我发现这个post关于完全相同的主题。 他的最终结论是,财产呼叫确实得到了优化。 我也可以发誓,我已经读了很多次,尽pipe是在IL中的callvirt ,简单的getter / setter属性将被内callvirt 。 那么我疯了吗? 编辑4 :里德·科普塞在下面的评论中发布了答案: 回复:编辑3 – 看到我更新的评论:我相信这是x86 JIT与x64 JIT问题。 在64位的JIT是不成熟的。 我希望随着更多的64位系统每天上网,MS会迅速改进。 […]