2011-04-17 194 views

回答

7

通常,一個屬性是由可變支持反正。即使你有這樣一個自動執行的屬性:

public string Name { get; set; } 

仍然有一個變量在幕後。不是所有屬性都支持變量(例如DateTime.Now),但絕大多數都是。

你幾乎應該總是使用一個屬性來訪問另一個類型的數據,而不是暴露變量。 (換句話說,這些變量本身應該是私有的。)這樣你就可以將類與它的實現分離開來了......一個類如何存儲其數據應該只涉及類本身。

如果你只有史以來指一塊類本身中的數據,你並不真正需要的特性可言,除非你想,當你改變它,或者類似的東西來進行驗證。

你通過屬性暴露一個變量之前值得思維縝密 - 如果你只是做這一切的時候,你失去了一定的封裝;類型通常不應該是只是是由其他代碼操縱的數據的集合。他們應該使用它們中的數據來公開更高級別的操作。這有點難以描述,我並不是說不好,本身 - 只是如果你不小心,它們可能會被過度使用。

3

一般來說,最好是創建公共屬性和私有變量。

有幾個理由有公共變量。

[其中需要性質的實例,是設置對象屬性,並且還提高事件以通知變化的訂戶。

+0

它與Jon Skeet的回答幾乎相同..更清楚:) – 2011-04-17 06:22:46

+1

@Shekhar_Pro:假設這是恭維...謝謝! – 2011-04-17 06:26:00

+0

+1 o是啊...... :) – 2011-04-17 06:29:03

1

可能有很多的情況下,有使用變量和性能之間的差異。 通常變量用於類的內部工作,而類不應暴露變量,換句話說,屬性將從其他類訪問。

另外一些代碼生成和工具要求您定義變量或屬性。例如在XAML(WPF和Silverlight)中,您必須公開變量以獲取依賴項屬性。

另外,由於屬性代碼被用於獲取或設置它們甚至可以被用於提供對存儲在其他地方的東西,而不是內部類變量的值來執行。例如,您可以定義一個屬性,允許將一段UI綁定到文本文件的內容。

0

您不'必須'使用字段而不是屬性,字段在運行時實際上更快。

但是,一般來說,你會想要在你的類上定義實例變量作爲屬性。這可以讓你做一些你無法用字段做的額外的事情。

  1. 可只讀或只寫
  2. 可以包含在類似的方法
  3. 可以有副作用接口。

你的類的接口可以使許多事情更容易,包括測試和保持。

public interface IStudentGroup { 
    List<string> NameList { get; } 
} 

副作用是最有用的功能之一。假設你有一個名爲Items的屬性包含一個集合。如果它是空的,你可能希望它自動初始化。例如:

private List<string> namesList; 
public List<string> NameList { 
    { 
    get { 
     if (namesList == null) namesList = new List<string>(); 
     return namesList; 
    } 
} 
0

只是爲了完整性,我想(從msdn)添加

性能不應該是計算複雜或產生副作用

所以對於計算複雜的操作或有副作用的情況下,寫GetX(), SetX()方法代替使用屬性

屬性獲取者應該是沒有任何先決條件的簡單操作。如果一個getter可能拋出一個異常,可以考慮重新設計這個屬性作爲一個方法。此建議不適用於索引器。由於參數無效,索引器可能會引發異常。