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