2009-10-06 54 views
12

你能告訴我是什麼性質的C#我的意思是實際的解釋確切用法爲什麼我們需要在C#屬性

在我們的項目中,我們使用的是像

/// <summary> 
/// column order 
/// </summary> 
protected int m_order; 

/// <summary> 
/// Get/Set column order 
/// </summary> 
public int Order 
{ 
    get { return m_order; } 
    set { m_order = value; } 
} 

/// <summary> 
/// constructor 
/// </summary> 
/// <param name="name">column name</param> 
/// <param name="width">column width</param> 
/// <param name="order">column order</param> 
public ViewColumn(string name, int width, int order) 
{ 
    // 
    // TODO: Add constructor logic here 
    // 
    m_name = name; 
    m_width = width; 
    m_order = order; 
} 


/// <summary> 
/// returns the column name, width, and order in list view. 
/// </summary> 
/// <returns>string represent of the ViewColumn object</returns> 
public override string ToString() 
{ 
    return (string.Format("column name = {0}, width = {1}, order = {2}.", 
     m_name, m_width, m_order)); 
} 

/// <summary> 
/// Do a comparison of 2 ViewColumn object to see if they're identical. 
/// </summary> 
/// <param name="vc">ViewColumn object for comparison</param> 
/// <returns>True if the objects are identical, False otherwise.</returns> 
public override bool Equals(object obj) 
{ 
    ViewColumn vc = (ViewColumn)obj; 
    if(m_name == vc.Name && 
     m_width == vc.Width && 
     m_order == vc.Order) 
     return true; 
    else 
     return false; 
} 
+0

可能的重複[我應該使用公共財產和私人領域或公共領域的數據?](http://stackoverflow.com/questions/1277572/should-i-use-public-properties-and-private-fields-or-public-字段爲數據) – nawfal 2014-07-17 20:21:53

回答

16

想想看:你有一個房間,一進門就進入這個房間。如果你想檢查誰是誰來保護你的房間,那麼你應該使用財產,否則他們將不會有任何門,每一個人都很容易進入沒有任何規定。

class Room { 
    public string sectionOne; 
    public string sectionTwo; 
} 

Room r = new Room(); 
r.sectionOne = "enter"; 

人們正在上一節很容易,沒有任何檢查。

class Room 
{ 
    private string sectionOne; 
    private string sectionTwo; 

    public string SectionOne 
    { 
     get 
     { 
     return sectionOne; 
     } 
     set 
     { 
     sectionOne = Check(value); 
     } 
    } 
} 

Room r = new Room(); 
r.SectionOne = "enter"; 

現在你檢查了這個人,並知道他是否有什麼邪惡的東西。

+0

不錯的一個..保持它 – 2011-08-12 07:51:04

31

簡短的回答性質:封裝

很長的答案:屬性是非常versitile。它允許您選擇想要如何將數據公開給外部對象。設置值時,您可以注入一些數據驗證。它還解決了類似於Java等的getX()setX()方法的難題。

+9

簡答:使getX()/ setX()模式更漂亮。長答案:封裝。 [需要的引證];) – Jimmy 2009-10-06 04:11:26

+1

例如請參閱http://stackoverflow.com/questions/1461598/what-is-the-point-of-setters-and-getters-in-java – Jimmy 2009-10-06 04:12:38

+0

+1爲答案-1的問題:爲什麼這個答案不被接受? – 2011-06-25 08:52:40

0

它們對於數據綁定很有用。

4

這就是使用它的方式,除了可能的設置方式。您可能不想訪問成員變量,而是想使用該類中的屬性,以便可以使用有關每個成員變量的統一規則。這是使用屬性的主要優點,是將訪問和setter邏輯全部集中到一個地方。它是否真的取決於您的具體需求,無論您是否想使用Property來設置它。但請注意,在構造函數中,在調用Property時需要非常小心,因爲您可能或不可能依賴於正在初始化的其他類,如果通過構造函數訪問,那麼將不會完成其他部分。這又取決於你的具體實現。

這也是一個少許清潔劑的使用方法:

myObject.Property1 = "Test String"; 
Console.WriteLine(myObject.Property1); 

比你在其他一些語言中看到:

myObject.setProperty1("Test String"); 
System.out.writeln(myObject.getProperty1()); 

在這裏,您可以封裝一些邏輯的情況下:

public int Order 
{ 
    get { return m_order; } 
    set 
    { 
     // Put some rules checking here. Maybe a call to make sure that the order isn't duplicated or some other error based on your business rules. 
     m_order = value; 
    } 
} 

他們有用的另一種方式是這樣的:

public int Order { get; private set; } 

現在你已經擁有了一個自動實現的屬性,它帶有隻能在類內部設置但是在其他地方讀取的支持成員變量。

最後,如果你需要控制邏輯,你可以這樣寫:

public int Order 
{ 
    get { return m_order; } 
    protected set 
    { 
     // Again, you can do some checking here if you want... 
     m_order = value; 
     // You can also do other updates if necessary. Perhaps a database update... 
    } 
} 
+0

你可以給我一個代碼 – peter 2009-10-06 04:12:06

+0

的實際解釋你去了,我已經添加了幾個。 – jasonh 2009-10-06 04:17:47

16

很多原因:

  • 語義。屬性將你類型的實現與接口分開。
  • 二進制兼容性。如果您需要更改屬性,則可以在不破壞相關代碼的二進制兼容性的情況下執行此操作。對於字段,即使新實現使用同名的屬性,也必須重新編譯的所有內容
  • 數據綁定。你不能綁定到一個領域。
+3

你有沒有睡過? – 2009-10-06 04:16:24

+0

*賤人自己*我不知道二進制兼容性的東西。尼斯。 – Tarik 2009-10-06 04:23:16

+0

@Justin:只在'y'結束的日子裏,但有時候不會很長。 – 2009-10-06 04:24:32

3

正如賈斯汀所說,封裝是面向對象的基本原則之一。您希望保持隱藏在外部的數據的內部表示,並提供批准的查看/操作方法。

C#屬性是構造,提供了一個簡單的方法來做到這一點。在你的榜樣,你沒有做任何事情的getset方法內,但在現實生活中,你可能需要做某些事情像

  • 店貨幣美分的10日爲一個長整型,但回到外面的世界作爲具有2個小數空格和$符號的字符串。
  • 將某個屬性限制爲只讀(或者甚至是隻寫:例如:密碼驗證程序/哈希生成器類)。
  • 當此值設置/獲取時,以某種方式更改對象的狀態。

在Java中,您編寫的getter和setters是分別返回或接受值的普通舊方法。

+0

+1用於訪問說明符方面,不僅用於調節數據級別(如成員),還用於操作級別(get/set):只讀,只寫 – jdehaan 2009-10-06 04:48:31

+0

在IL級屬性也有方法。事實上,C#編譯器爲屬性創建諸如get_Order和set_Order之類的方法,並且不允許您使用相同的名稱定義自己的方法。 – softveda 2009-10-06 06:04:56

6

這裏有一個共同的模式:

class Foo { 

    private Bar _bar; 

    //here, Foo has a Bar object. If that object has already been instantiated, return that value. Otherwise, get it from the database. 
    public Bar bar { 
     set { _bar = value;} 
     get { 
      if (_bar == null) { 
       _bar = Bar.find_by_foo_name(this._name); 
      } 
      return _bar; 
     } 
    } 
} 

總之,這使我們能夠訪問我們的Foo實例的酒吧對象。這個封裝意味着我們不必擔心如何檢索Bar,或者如果foo.bar已經實例化。我們可以使用這個對象,讓Foo類的內部處理它。

4

屬性用於限制對類的成員變量的直接訪問。 使用屬性維護抽象。 無論何時您想使用屬性實例化一個對象並將數據設置爲它的成員變量,都可以檢查某些條件是否將該值設置爲成員變量。 您可以限制對屬性的讀寫操作,以便在訪問該類的對象時可以只讀,只寫成員變量的值。

4

設計時間優勢

屬性使得視覺設計容易,你有最有名的屬性瀏覽器的Visual Studio,讓你改變對象的屬性。

地產也提供驗證的額外的元數據,屬性瀏覽器中的視覺外觀,像下拉,範圍,顏色選擇器等

獨立的數據和操作

他們的「數據」之間忠實地代表差對象的對象和「動作」(方法)。

當我們看課程的時候,如果我們有50種方法可以看,不是每個人都會使用正確的函數命名,這會使以後難以理解。我總是告訴程序員,無論你什麼時候編程,都要以這樣的方式編寫代碼,5年後,如果其他人查看代碼,他應該瞭解代碼。

使用方法名稱的數據訪問和一些操作在長期運行中會產生混淆......就像Stack的情況一樣,Push/Pop是操作,但「Size」或「Count」是數據。

創建「Count」屬性只是將其目的區分爲數據而不是操作。

數據綁定

正如其他人所提到的,性能提供數據綁定的先進水平像雙向綁定等

訪問限制

提到你可以有隻讀屬性和其他訪問由他人。

反思

它的小易以書面基於反射通用代碼的情況下與性質的工作。

不同的存儲實施

公共變量存儲數據僅作爲成員,還有什麼地方特性提供不同的方式來存儲不同格式的數據像internaly它們可以被存儲爲散列表(因爲它們是依賴對象做過WPF)。他們可以被緩存。他們出租車可以進一步轉達給其他一些兒童實體或其他實體。但是對於呼叫者隱藏了實現。

驗證

設置屬性可能因此需要一定的驗證,以及驗證碼中的「設置」部分代碼可以輕鬆幫你驗證輸入和報告錯誤。

通知

方法可以提高通知的事件,如INotifyPropertyChanged.PropertyChanged哪些其他對象可以偵聽和更新顯示值的設置的一部分。這是高級數據綁定的重要組成部分。

總之,它是一個新的「標準」的數據存儲,具有先進的設施,然後只是將數據存儲在類的成員。通過避免屬性,通常您可以執行所有功能,但由於實施可能會因人而異,因此其標準可幫助每個人以單一形式定義/訪問/驗證/通知數據存儲,稱爲「屬性」