字段(Field)
是一種表示與對(duì)象或類關(guān)聯(lián)的變量的成員。通常情況下,應(yīng)僅對(duì)具有 private 或 protected 可訪問(wèn)性的變量使用字段,即字段的設(shè)計(jì)初衷是供類或類的派生類內(nèi)部使用的,其聲明只讀屬性,作用是存儲(chǔ)數(shù)據(jù)。
屬性(Property)
是另一種類型的類成員,定義屬性的目的是在于便于一些私有字段的訪問(wèn)。類提供給外部調(diào)用時(shí)用的可以設(shè)置或讀取一個(gè)值,屬性則是對(duì)字段的封裝,將字段和訪問(wèn)自己字段的方法組合在一起,提供靈活的機(jī)制來(lái)讀取、編寫(xiě)或計(jì)算私有字段的值。屬性有自己的名稱,并且包含get 訪問(wèn)器和set 訪問(wèn)器。
聲明格式:
屬性修飾符 類型 屬性名
{
get{
//get訪問(wèn)器代碼
}
set{
//set訪問(wèn)器代碼
}
}
屬性分類:根據(jù)get訪問(wèn)器和set訪問(wèn)器是否存在,屬性可按下列規(guī)則分類。

那么問(wèn)題來(lái)了,既然已經(jīng)有字段用來(lái)存儲(chǔ)數(shù)據(jù),為什么還要引入屬性來(lái)對(duì)數(shù)據(jù)進(jìn)行訪問(wèn),把聲明的字段直接定義成公有的不就可以了嗎?
解答:在C#中,我們可以非常自由的、毫無(wú)限制的訪問(wèn)公有字段,但在一些場(chǎng)合中,我們可能希望限制只能給字段賦于某個(gè)范圍的值、或是要求字段只能讀或只能寫(xiě),或是在改變字段時(shí)能改變對(duì)象的其他一些狀態(tài),這些單靠字段是無(wú)法做到的,于是就有了屬性,屬性中包含兩個(gè)塊:set和get,set塊負(fù)責(zé)屬性的寫(xiě)入工作,get塊負(fù)責(zé)屬性的讀取工作。在兩個(gè)塊中都可以做一些其他操作,如在set中驗(yàn)證賦的值是否符合要求并決定是否進(jìn)行賦值。當(dāng)缺少其中一塊時(shí)屬性就只能讀或只能寫(xiě),set和get塊中屬性必需有一個(gè),因?yàn)榧床荒茏x又不能寫(xiě)的屬性是沒(méi)有意義的??傊?,外部能夠訪問(wèn)和修改定義為public的字段,這么做是違反類的安全性設(shè)計(jì)原則的,所以一般的字段都是設(shè)為私有的,字段的訪問(wèn)便是由屬性來(lái)實(shí)現(xiàn)。
C#通過(guò)屬性特性讀取和寫(xiě)入字段(成員變量),而不直接直接讀取和寫(xiě)入,以此來(lái)提供對(duì)類中字段的保護(hù)。
屬性VS字段


適用情況
公共字段:
允許自由讀寫(xiě)
取值范圍只收數(shù)據(jù)類型約束而無(wú)其他任何特定限制;
值的變動(dòng)不需要引發(fā)類中其它任何成員的相應(yīng)變化;
如果均滿足上述條件,那么我們便可以大膽地使用公共字段;
屬性:
要求字段只能讀或只能寫(xiě);
需要限定字段的取值范圍;
在改變一個(gè)字段的值的時(shí)候希望改變對(duì)象的其它一些狀態(tài);
如果滿足上述條件中的任何一個(gè),就應(yīng)該使用屬性。
代碼展示
pulic class User
{
private string _name;//_name為字段
public string Name //Name為屬性,它含有代碼塊
{
get
{
return _name;//讀?。ǚ祷豞name值)
}
set
{
_name = value;//為_(kāi)name賦值
}
}
User類的私有的字段m_name可以通過(guò)公開(kāi)的屬性Name對(duì)它進(jìn)行讀寫(xiě)操作。 通過(guò)“屬性”讀取“字段”值時(shí),將觸發(fā)get訪問(wèn)器;通過(guò)“屬性”為“字段”賦值,將觸發(fā)set訪問(wèn)器。
總結(jié)
屬性以靈活的方式實(shí)現(xiàn)了對(duì)私有字段的訪問(wèn),是字段的自然擴(kuò)展,一個(gè)屬性總是與某個(gè)字段相關(guān)聯(lián),字段能干的,屬性一定能干,屬性能干的,字段不一定干的了;為了實(shí)現(xiàn)對(duì)字段的封裝,保證字段的安全性,產(chǎn)生了屬性,其本質(zhì)是方法,暴露在外,可以對(duì)私有字段進(jìn)行讀寫(xiě),以此提供對(duì)類中字段的保護(hù),字段中存儲(chǔ)數(shù)據(jù)更安全。