1

今天正在处理一些我没有编写的代码,并注意到在一个类中有一个私有成员m_privateMember。编码器还包含一个名为的方法,该方法GetPrivateMember()仅包含return m_privateMember. 值得一提的是,这个方法在类本身中被大量使用,而不是简单地使用在这个范围内可访问的私有字段。

从语义上讲,我认为这有很多问题。一个方法与一个实际的 getter/setter 看起来很草率,我一直认为如果你在类范围内,最好是实际使用私有字段而不是 getter。不用说,我将清理代码纯粹是因为它不符合我们工作场所的编码标准,但我很想知道这样做是否也会以任何方式提高性能?

调用仅返回私有字段的方法会调用更多开销吗?

4

2 回答 2

2

直接回答你的问题:这取决于。

return private field对于该程序集中的任何调用,编译器(启用优化时)很可能内联一个属性,该属性只是一个单一的属性。在这种情况下,它与直接访问字段的操作相同。

对于从程序集外部访问属性的调用,JIT 编译器可能会以与静态编译器相同的方式内联调用,但不允许静态编译器这样做,因为它必须尊重程序集提供的接口. 这样您就可以用没有公共更改的新版本替换已编译的程序集,并且无需重新编译应用程序源即可使用新版本。

随着属性变得越来越复杂,被静态编译器或 JIT 编译器内联的机会变得越来越少,并且属性被调用得更像您想象的那样。


综上所述,关于性能的讨论确实是学术性的。在几乎所有实际示例中,调用属性与读取私有字段之间的区别是微不足道的。唯一可以测量的情况是,如果您在一些非常低规格的嵌入式系统上运行,或者每秒为系统的每个用户执行数十亿次读取。

大多数计算机都非常快,因此您应该选择使您的代码更易于维护的技术,而不是让您的执行时间额外减少 0.0000001 秒的技术。

于 2012-12-17T15:16:26.623 回答
1

调用仅返回私有属性的方法会调用更多开销吗?

没有真正明显的区别,但美学和正确使用在这里,其他一切都是平等的,因为每个 get 和 set 实现的每个属性都会生成一个 getter 和 setter 方法 - 所以所有从属性返回事物值的调用实际上是一个方法调用,尽管可能有一些实现因素/优化正在进行,即使在速度方面,使用属性也“更好”,但在大多数情况下对可比效果的改进可以忽略不计。

于 2012-12-17T15:04:40.360 回答