C# · 12月 25, 2021

c# – 为什么属性执行比Field或Method执行慢?

在 CLR via CSharp第10章“属性”Jeff Richter写道:

A property method can take a long time to execute; field access always
completes immediately. A common reason to use properties is to
perform thread synchroni- zation,which can stop the thread forever,
and therefore,a property should not be used if thread
synchronization is required. In that situation,a method is preferred.
Also,if your class can be accessed remotely (for example,your class
is derived from System.MarshalByRefObject),calling the property
method will be very slow,and therefore,a method is preferred to a
property. In my opinion,classes derived from MarshalByRefObject
should never use properties.

即使属性被定义为只返回私有字段也是如此?为什么同步方法首选?为什么在MarshalByRefObject方案中首选一个方法?

澄清我的问题:Jeff似乎正在做一个全面的陈述,即属性是不可取的,在这两种情况下,方法是比较可取的.正如Joe White指出的,属性可以有任意代码.但方法可以运行相同的任意代码.这是我有困难的部分.使用方法实际上是有利于使用属性(给定相同的代码用于同步还是编组),还是仅仅使用语言约定的问题?

解决方法 我认为他指出,因为一个属性可以运行任意代码,调用代码不应该假定它会立即完成.

如果所有的属性都返回一个字段,那么它的方法体实际上将被JIT编译器内联,它将和一个字段访问一样快.所以不是这样的东西慢慢的;这是他们是黑盒子.如果你不知道一个财产是如何实现的,那么你不能对它快速返回做出假设.

(也就是说,制造一个缓慢的财产将会明显违反.NET Framework Design Guidelines,特别是这一个:“使用一种方法而不是一种财产,[如果]操作比一个字段设置的速度要慢一个数量级. )

至于他提出使用方法的建议,我不能理解.属性是方法:属性getter是一个方法(通常命名为get_PropertyName),属性setter是一个方法(set_PropertyName),读取属性的代码被编译为使得方法调用get_PropertyName的代码.没有什么特别的,使一个属性比方法更慢.