2012-02-06 92 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