c 欄位和屬性

2021-05-28 14:47:28 字數 2750 閱讀 9747

一、字段(field)

可以在宣告欄位的同時賦給它乙個初始值。

二、屬性(property)

1、引入

假如將字段宣告為public,則在類的外部都可以對該字段進行訪問和更改,違背了類的封裝特性。如果宣告為private,則這種形式的封裝通常又過於徹底。例如,你可能希望欄位從外部唯讀,但從內部可以更改,但需要驗證對資料進行的更改。

以前,程式語言為了實現這些要求,採取的辦法是將字段標記為私有,然後提供取值和賦值的方法來訪問和修改資料。遺憾的是,這樣做會影響類的可程式設計性。無法再用賦值運算子來設定類中的資料。另外,要想訪問資料,只能呼叫方法來進行。

考慮到經常會用到這種設計模式,c#的設計者決定為它提供顯示的語法支援即屬性。

2、構成

屬性的宣告看起來和字段宣告一樣,但跟隨屬性名之後的是一對大括號。在大括號中,要新增具體的屬性實現**。兩個可選的部分構成了乙個屬性的實現。其中,get標誌的屬性的取值方法部分,set標誌著屬性的賦值方法部分,它允許你呼叫字段賦值語法。

3、自動實現的屬性

它允許在宣告乙個屬性時,不實際的實現任何取值方法或賦值方法,也不宣告任何支援字段。

例如:class employee

set 

private string _firstname;  //屬性firstname的支援字段

public string lastname  // 自動實現的屬性

4、屬性作為虛字段使用 即該屬性沒有支援字段

在某些情況下,你甚至根本不需要乙個支援字段。你可以讓屬性的取值方法返回乙個計算好的值,而讓賦值方法解析值,並把它持久儲存到其他一些成員欄位中。

例子:class employee

set 

private string _firstname; 

public string lastname   

get  

set 

private string _lastname ; 

public string name//屬性作為虛字段使用

get  

set );//  public string split( params char  separator) 

//separator :分隔此例項中子字串的 unicode 字元陣列、不包含分隔符的空陣列或 nothing。

// 返回值:乙個陣列,其元素包含此例項中的子字串,這些子字串由 separator 中的乙個或多個字元分隔。

if(names.length==2)

else   'is invalid",value ) ) }

5、唯讀和只寫屬性

通過移除某個屬性的取值方法或賦值方法部分,可以改變屬性的可訪問型。只有賦值方法的屬性為只寫屬性,這種情況很罕見。只提供取值方法的屬性為唯讀屬性,任何賦值企圖都會造成編譯錯誤。

6、為屬性的取值和賦值方法指定訪問修飾符

(1)若不為屬性的賦值和取值方法指定訪問修飾符,則他們的訪問修飾符預設為屬性的訪問修飾符。

(2)在c#2.0中,可以為get或set部分指定訪問修飾符(但不能為兩者同時指定訪問修飾符),從而覆蓋了為屬性宣告指定的訪問修飾符。例如,在乙個屬性中同時建立乙個公共取值方法和乙個私有賦值方法,是外部類只能對屬性進行唯讀訪問,而允許類內的**想屬性寫入。

(3)為取值或賦值方法指定訪問修飾符時,這個訪問修飾符的限制性必須必應用於整個屬性的訪問修飾符更嚴格。

7、屬性和方法呼叫不允許作為ref或out引數值使用

ref和out引數值在內部實現時,需要將記憶體位址傳給目標方法。但是,由於屬性可能是沒有支援欄位的虛屬性,也有可能是唯讀或只寫的,因此不可能傳遞其基礎儲存的位址。所以,不能將屬性作為ref或out引數值來傳遞。同樣地道理也使用於方法呼叫。如果需要將乙個屬性或方法呼叫作為ref或out引數值來傳遞,首先必須將值複製到乙個變數中,然後傳遞該變數。方法呼叫結束後,在將變數的值賦回屬性。

8、屬性和其支援欄位的命名規範

假如屬性名為firstname,那麼為該屬性提供支援的私有字段來說,一些常見的命名規範是_firstname和m_firstname(延續自c++的一種命名規範,m代表member variable 成員變數)。另外,還可以採用camel大小寫規範(除第乙個單詞外其餘單詞的首字母都大寫)。不管為私有字段使用哪一種命名規範,都要依據pascal大小寫規範(每個單詞的首字母都大寫)來命名公共欄位和屬性。

9、在類的內部關於欄位的訪問性問題

作為乙個良好的程式設計習慣,我們應該只在屬性實現的內部訪問為屬性提供支援的字段。即 我們使用的應該一直是屬性,而不要直接呼叫字段。許多時候,即使是在包容屬性的那個類中,也不應該從屬性實現的外部訪問它所支援的字段。這樣一來,在為屬性新增了驗證邏輯或者其他額外的邏輯後,整個類就可以馬上利用那些邏輯。

10、屬性和字段的區別

@1、屬性可以唯讀或只寫,公有成員一定是可讀寫的。

@2、屬性裡頭你可以寫** 做自己的驗證邏輯即 屬性除了公布欄位外,還可以在屬性上新增對字段的約束規則,比如唯讀,只寫,讀寫規則,還可以對屬性的值範圍設定等等。而字段則不可以

總之,字段能幹的,屬性一定能幹,屬性能幹的,欄位不一定幹的了。另外從軟體設計的原則來看,屬性是方法,應當暴露,而字段是資料應當被封裝。

C 字段,屬性和屬性封裝字段

c 類成員包括 字段,屬性和方法。對於日常對於乙個類我們新增成員時會有幾種方法。如對於乙個person 類,我們對於其中乙個成員 性別 gender 進行定義,可以寫成 1,public string gender 2,public string gender 3,private string ge...

欄位和屬性(C )

類成員預設為私有成員。如果不為類成員新增訪問修飾符,那麼預設的是private。公共成員需要顯式指定。欄位和屬性是不同的兩個概念 欄位是類中實打實的一種變數。用來儲存與物件相關聯的資料。所以當欄位規定為public時,在當前類之外其他類中 隨 時隨地訪問和修改字段值 只要定義好當前類的例項即可,除s...

C 欄位和屬性

一般吧類或結構中定義的變數和常量叫字段。字段分為 靜態字段,例項字段,常量欄位和唯讀字段。常量字段 用const修飾符宣告的字段為常量,常量只能在宣告中初始化,以後不能再修改。靜態字段 用修飾符static宣告的字段為靜態字段。不管包含該靜態欄位的類生成多少個物件或根本無物件,該字段都只有乙個例項,...