2016-01-03 45 views
-2

如果財產可以存儲數據(如字段所示)爲什麼我們仍然需要字段如果有屬性,爲什麼我們需要字段?

,比如我有這個類,

public class Music 
{ 
    public Music() { } 
    public float musicBPM { get; set; } 
    public void addBPM() 
    { 
     this.muscBPM +=10; 
    } 
} 

它還是那樣工作,因爲我有一個私有字段並改變它的價值,對不對?

那麼,如果您可以使用該屬性,最新的領域需求是什麼?

+0

屬性給你一個黑匣子,其中字段不。 –

+2

[「屬性是提供靈活機制來讀取,寫入或計算私人字段值的成員。」](https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx) – Cyral

+0

@Cyral男士我印象深刻MSDN有一些很好的寫作! –

回答

4

雖然自動屬性模糊的區別相當多,有一個字段和屬性之間的根本區別:

  • 字段是能夠存儲東西的數據成員,
  • 一個屬性是一種方法或一對方法,通過編譯器的幫助,可以像使用字段一樣使用它們。

換句話說,當你寫

public float musicBPM { get; set; } 

編譯器創建這樣的事情:

private float musicBPM_property; 
public float musicBPM { 
    get { return musicBPM_property; } 
    set { musicBPM_property = value; } 
} 

當你做一個自動屬性,字段仍然存在,但是編譯器巧妙地將它從你身上隱藏起來。

這就是爲什麼這些字段將在.NET中保持爲一個概念。但是,C#6的自動只讀屬性可以消除手動編寫的代碼中的字段。

+0

這兩個子彈總結了爲什麼*兩者存在的區別。 (這個問題不是關於'何時使用'的問題。) – user2864740

+0

@ user2864740這也不回答「何時使用」問題:大部分內容解釋了爲什麼屬性無法替換字段。 – dasblinkenlight

+0

這是作爲一個承認,而不是負面批評的答案=^_^= – user2864740

2

屬性仍然需要一個字段作爲後備存儲庫,屬性實際上包含兩個訪問該後臺字段的方法(所謂的getter和setter)。

msdn

屬性是,提供了一個靈活的機制來讀,寫 或計算私有字段的值的構件。屬性可以像使用公共數據成員一樣使用,但它們實際上是稱爲訪問器的特殊方法。這使數據能夠被輕鬆訪問,並且仍然有助於提高方法的安全性和靈活性。

2

您不會爲您的屬性賦值......即使您這樣做,一天結束時也會分配給一個變量。

所以,當你說myprop = 20數據實際上被分配到一個變量名爲somevar幕後。

public int myprop 
{ 
    set { somevar = value; } 
} 

如果你有點困惑看到自動屬性,並認爲你實際上分配值的屬性,那是不正確的。編譯器後面會創建專用的後臺字段來保存這些值。

所以,在一句話中;屬性給你一種封裝你的類字段的方法。

public int myprop {get; set; } 
相關問題