2012-02-06 73 views
9

CLR via CSharp第10章“属性”杰夫里氏写道:为什么Property执行速度比Field或Method执行速度慢?

甲属性方法可能需要很长的时间来执行;现场访问始终 立即完成。使用属性的一个常见原因是 执行线程同步,它可以永久停止线程, ,因此,如果需要线程 同步,则不应使用属性。在那种情况下,一种方法是优选的。 另外,如果您的类可以远程访问(例如,您的类 从System.MarshalByRefObject派生),调用属性 方法将非常缓慢,因此,方法优于 属性。在我看来,从MarshalByRefObject 派生的类不应该使用属性。

即使属性被定义为只返回私人字段,情况是这样吗?为什么方法首选同步?为什么在MarshalByRefObject场景中首选方法

为了澄清我的问题:
杰夫似乎在做一个一揽子声明,说属性不是可取的,在这两种情况下,这些方法更可取。正如Joe White指出的,属性可以具有任意代码。但是方法可以运行相同的任意代码。这是我遇到困难的部分。实际上在使用方法优于使用相同属性的代码(使用相同的代码),还是仅仅在语言约定方面存在问题?

回答

9

我认为他的观点是,因为一个属性可以运行任意代码,所以调用代码不应该认为它会立即完成。

如果所有属性都返回一个字段,那么它的方法体实际上将由JIT编译器内联,并且它将与字段访问一样快。所以这并不是说房地产速度会变慢。这是他们是黑盒子。如果你不知道财产是如何实施的,你不能对其快速返回做出假设。 (这就是说,制作一个缓慢的属性会明显违反.NET Framework Design Guidelines,特别是这个:“使用方法而不是属性,[如果]操作的速度比字段集要慢几个数量级将是“)

至于他的建议,而不是使用方法,我不能有任何意义。属性方法:属性getter是一种方法(通常名为get_PropertyName),属性设置器是方法(set_PropertyName),读取该属性的代码被编译为代码,从而使方法调用为get_PropertyName。没有什么特别的东西会让属性比方法慢。

+7

Jeff的观点是,一个“GetBlah”方法调用*与读者进行通信*“这可能会很慢”,而“Blah”属性表示“这几乎肯定是快速的”。所以,如果你想让事情变得缓慢,那就把它变成一种方法吧。我并不完全同意这个建议 - 例如,我经常制作速度缓慢(*不太可能出现最坏情况),但具有优异*摊销*表现的物业。但杰夫的建议绝对是一个很好的起点;一旦你知道你在做什么,就会偏离它。 – 2012-02-06 15:09:39

5

我认为重点是属性访问看起来像一个字段访问,所以人们不期望任何异常。

如果您有一个属性可能需要很长时间,则应该将其重写为一种方法。它不会让你的代码执行得更好,但它会更清楚,它可能需要很长时间。

就性能而言,属性访问和方法调用没有区别。其实财产访问只是一个方法调用。

+0

呃..他明确地说过:“调用属性方法会非常缓慢,因此,一种方法比属性更受欢迎”。所以这不仅仅是外表......至少按照Jeff的说法.. – 2012-02-06 18:38:37

+1

调用这个属性会很慢,而且人们不希望属性变慢。调用方法的速度同样缓慢,但人们期望某些方法很慢。 – svick 2012-02-06 21:39:45

3

方法不比属性快,但方法预计不会像属性一样快。所以这个方法更好的表明它可能需要一些时间(因为在这种情况下线程同步)。

根本不“执行”字段。访问一个字段直接访问内存。

+0

访问实例字段是*间接*访问内存,因为首先必须在内存中定位*接收器*。 – 2012-02-06 15:12:49

+0

@Eric:是的,当然,我的意思是你正在访问内存,而不是执行代码。 – 2012-02-07 07:46:12