在读/写操作中,属性与备份字段之间是否存在性能差异?
-
02-10-2019 - |
题
在类自身的字段和属性中在类中工作时,我通常只在执行某些功能(例如限制值或验证或其他任何功能)时使用该属性。否则,我更喜欢直接读取/编写备份字段。
我以某种方式使这是一种更普遍的做事方式,但我确实没有任何证据支持这一想法。
除了惯例或品味外,一种方法和其他方法之间是否还有实际的性能因素?
解决方案
如果该属性是直接的GET/将其编译为单词 - 换句话说,编译器将使用该属性或字段直接将其转动为同一物体 - 因此没有性能差异。
但是,Get/set可以合并他们想要的任何逻辑,因此很昂贵 - 但是,准则通常建议保持它们的光线。
属性有一些好处,即使它们只是获得/设置封面:
- 数据绑定只能看到属性,而不是字段。
- 它与封装的概念保持一致。
- 您可以仅执行读取或仅编写语义。
- 您可以单独应用属性到基础字段(在序列化方案中有用)。
顺便说一句,尽管有趣的是要查看这些事物的分钟性能特征 - 在生产代码中采用这种优化(嗯,在这种情况下,没有一个) 可能 在过早优化的旗帜下。
其他提示
这确实取决于。从技术上讲,它可能会更慢,但是即使在这种情况下,也几乎是无法理解的。以下是如何从 这里.
- 不超过32个字节的IL的方法不会被归类。
- 虚拟函数没有嵌入。
- 具有复杂流控制的方法不会被衬里。复杂的流量控制是除/then/否时的任何流控制;在这种情况下,切换或稍加切换。
- 包含异常处理块的方法并未嵌入,尽管抛出异常的方法仍然是候选人的内衬。
- 如果该方法的任何形式论点是构造,则该方法不会被归类。
由于C#编译器与属性声明创建了单独的Getter和Setter方法,因此显而易见地将其独立于彼此对待。根据上述规则,我会说大部分时间属性访问者都是内衬的。我认为,关于必须是非虚拟方法的方法的规则将是经常发生的非平凡的展示者之一。
性能没有差异。如果您使用 反射器 要查看代码的拆卸,它会自动以最简单的方式为您创建背景字段。这实际上只是您的编译器为您提供的句法糖,以使生活更轻松。
如果类或结构暴露了结构类型的可变字段,则可以访问该结构的各个字段,而无需复制整个内容。相比之下,如果它暴露了属性(是否可变)或“读取”字段,则访问结构的任何部分将导致系统复制整个结构,然后访问副本。此外,消费者代码可以方便,高效地修改裸露的结构字段的字段,而无需任何冗余的复制操作。相比之下,如果将结构暴露为属性,则修改其任何部分将要求消费者将其复制到临时变量,进行更改,然后将其存储回去,这一系列步骤可能会导致整个结构要复制四次(阅读时供应商和消费者一次,在写作时再次复制)。