2009-12-06 29 views
11

可能重複:
Properties vs Methods何時使用屬性與方法?

是否有任何規則或者一般的最佳實踐何時使用屬性VS的方法?從技術上講,任何無參數方法都可以在屬性中進行,任何屬性都可以作爲一種方法,但有時候何時決定何時使用其他屬性可能會模糊。

我一直希望得到一些規則,你們在決定兩者之間時會牢記在心。

回答

12

一般標準是關於副作用。如果通過調用一個成員來獲得一個值,那麼你只能得到該值,這是一個屬性。如果有副作用,它應該可能是一種方法。

換句話說:儘管屬性不是字段,但它們的行爲應該非常像字段。這意味着不會產生副作用,執行時間不會太長,也不會拋出異常。

+6

不拋出異常?如果設置的值是無效值,你會怎麼做?我認爲這是在字段上使用屬性的原因之一......在接受它之前對值進行檢查的能力。 – Svish 2009-12-06 06:01:55

5

添加到cletus所說的。

這是從MSDN:「物業使用指南」 http://msdn.microsoft.com/en-us/library/bzwdh01d(VS.71).aspx 參見「屬性與方法」部分:

  • 的操作是轉換,如Object.ToString。
  • 該操作非常昂貴,您希望與用戶溝通他們應該考慮緩存結果。
  • 獲取使用get訪問將有可觀察到的副作用的屬性值。
  • 連續兩次調用成員會產生不同的結果。
  • 執行順序很重要。請注意,應該可以按任意順序設置和檢索類型的屬性。
  • 該成員是靜態的,但返回一個可以更改的值。
  • 該成員返回一個數組。返回數組的屬性可能非常具有誤導性。通常有必要返回內部數組的副本,以便用戶不能更改內部狀態。這加上用戶可以輕易認定它是索引屬性的事實導致代碼效率低下。在下面的代碼示例中,每次調用Methods屬性都會創建一個數組副本。結果,數組的2n + 1個副本將在以下循環中創建。
1

使用屬性時,一些er ..屬性是快速執行(例如ctrl.Color,ctrl.Text,ctrl.Width,DateTime.Now)。但如果它表示一個進程,則使用方法(例如str.GetHash(),machine.GetFqdn(),file.GetMd5())。所以在文件MD5,你不會讓一個屬性

此強調它最when to use a method

操作是 要傳達給用戶 ,他們應該考慮緩存夠貴的 結果。

請注意.NET的DateTime。現在,儘管速度和屬性都很快,但它在程序中被多次調用時需要緩存,即使彼此靠近也是如此。他們決定讓它成爲一個財產,財產有一個當前性在它的感覺,不像當你調用一個方法時,它沒有感覺即時性/當前性在它。所以你需要考慮到,即使你得到一個價值並需要緩存,但如果它需要感受即時,通過任何方式使用財產。畢竟,如果事情真的很快,而且不像昂貴的操作,它必須有一個可以傳達其堅固性的結構。我認爲這就是爲什麼.NET有吸引力(或任何具有屬性構造的語言)的原因,它不會強制開發人員在使其成爲屬性時使用方法,它不會強制開發人員在使用方法時高性能的代碼圍繞重載的操作符,這是最好的務實編程

0

這是一個很好的問題。我不知道這方面的最佳做法。 在我看來,這通常是一個常識問題。

屬性與它自己的對象/類相關,通常描述它。 UI元素,背景,顏色,IsEnabled的最佳示例是適合的。

這些方法通常是對象/類可以執行並可以產生結果的操作。這裏最好的例子是MessageBox的Show方法。它會執行一個操作並返回結果。

0

在基本層面上,選擇屬性或方法之間的決定取決於'有','是'的論點。如果您需要的信息是屬性或質量,請使用屬性。如果這是一個行動,那麼方法。

但是在實踐層面上,可能很難以這種方式始終如此實施。

  • 正如它被正確地指出,屬性應該是重量輕,方法不必是。
  • 如果信息依賴於在構造函數中調用的一些初始化代碼,那麼您應該更喜歡一個屬性。
  • 如果您的信息需要大量操作,請使用方法。
  • 如果它影響第三個元素,如文件或屏幕或其他東西,請使用方法。
  • 您不能擁有不返回任何內容的屬性(void)。
0

用基本詞語來說,屬性描述的是對象,而方法是對象可以做的動作。 對於代表汽車的物體,drive()將是一種方法,並且color將是屬性。