在CLR via CSharp第10章“属性”中,Jeff Richter写道:
属性方法可能需要很长时间才能执行;现场访问总是如此 马上完成。使用属性的常见原因是 执行线程同步,可以永久停止线程, 因此,如果是线程,则不应使用属性 同步是必需的。在那种情况下,一种方法是优选的。 此外,如果您的班级可以远程访问(例如,您的班级 派生自System.MarshalByRefObject),调用该属性 方法将非常慢,因此,方法优于a 属性。在我看来,类派生自MarshalByRefObject 不应该使用属性。
即使将属性定义为仅返回私有字段,是不是这种情况?为什么同步中首选方法?为什么在MarshalByRefObject场景中首选 Method ?
澄清我的问题:
杰夫似乎在全面地声明属性是不可取的,并且在这两种情况下这些方法更可取。正如乔怀特所指出的,属性可以有任意代码。但是方法可以运行相同的任意代码。这是我遇到困难的部分。使用方法而不是属性(给定相同的代码用于同步或编组),或者他只是在语言约定方面有问题吗?
答案 0 :(得分:9)
我认为他指出,由于属性可以运行任意代码,调用代码不应该假设它会立即完成。
如果所有属性都返回一个字段,那么它的方法体实际上将由JIT编译器内联,并且它将与字段访问一样快。所以这并不是说属性有点慢;这是他们的黑盒子。如果你不知道如何实现一个属性,你就不能对它快速返回做出假设。
(也就是说,制作一个缓慢的属性将明显违反.NET Framework Design Guidelines,特别是这个:“使用方法,而不是属性,[如果]操作比数量级慢字段集将是“。)
至于他对使用方法的建议,我无法理解。属性是方法:属性getter是一个方法(通常名为get_PropertyName
),属性setter是一个方法(set_PropertyName
),并且读取属性的代码已编译调用get_PropertyName
进行方法调用的代码。没有什么特别的东西可以使一个属性比方法慢。
答案 1 :(得分:5)
我认为重点是属性访问看起来像是一个字段访问,因此人们不会期待任何异常。
如果您的属性可能需要很长时间,则应将其重写为方法。它不会使您的代码执行得更好,但更清楚的是它可能需要很长时间。
就性能而言,属性访问和方法调用之间没有区别。实际上,属性访问只是一个方法调用。
答案 2 :(得分:3)
方法并不比属性快,但预计方法不会像属性一样快。因此,首选该方法要明确它可能需要一些时间(因为在这种情况下是线程同步)。
字段不是"已执行"一点都不访问字段直接访问内存。