C 物件導向 屬性

2022-07-04 03:57:13 字數 2196 閱讀 5940

一、屬性(property)作為類和結構的成員,是對字段的一種封裝方式,實際上是一種特殊的方法,被稱為訪問器(accessor),從而隱藏實現和驗證**,有助於提高字段讀取和賦值的安全性和靈活性;

1.屬性訪問器包含兩種型別:用於讀取並返回值的get訪問器,用於賦值新值的set屬性訪問器;通常將字段宣告為私有字段,然後通過屬性來對其進行訪問:

private

int mynum = 10; //

屬性要讀取和賦值的字段,也被稱為後備字段(backing field)

public

intmynum

set//

set訪問器}//

使用時,像字段一樣進行訪問:

int num = mynum + 10; //

讀取屬性時,呼叫mynum的get訪問器讀取mynum的值

mynum = 30; //

給屬性賦值時,呼叫mynum的set訪問器給mynum賦值

※在開啟優化**選項時,對get訪問器的呼叫將由jit編譯器進行方法內聯優化,不存在方法呼叫開銷,但無法內聯虛屬性的get訪問器;

2.屬性根據其宣告的訪問器種類分為三種:讀寫屬性(同時宣告get訪問器和set訪問器)、唯讀屬性(只宣告get訪問器)和只寫訪問器(只宣告set訪問器);

※只寫屬性很少出現,常用於限制對敏感資料的訪問;

3.訪問器的可訪問性預設與屬性的可訪問性相同,當屬性同時宣告了get訪問器和set訪問器時,可以給其中任意乙個訪問器新增可訪問修飾符來指定其可訪問性,顯式宣告的可訪問性要比屬性本身的可訪問性有更嚴格的限制;

※通常通過指定公共屬性的訪問器可訪問性來保留get訪問器的公共可訪問性,限制set訪問器的可訪問性:

public

intmynum

private

set//

將set訪問器宣告為私有的

}

4.當訪問器中不需要任何額外邏輯時,可以使用自動實現屬性(auto-implemented property,簡稱自動屬性,auto property)簡化屬性的宣告方式,不再需要單獨宣告乙個字段,將由編譯器建立僅可以通過訪問器訪問的專用、匿名字段(無法在客戶端**中直接訪問該欄位),宣告訪問器時也不需要提供具體實現:

public

int myproperty

※自動屬性的訪問器依然可以使用訪問修飾符;

※自動屬性必須宣告get訪問器,唯讀的自動屬性可以在初始化時和建構函式中賦值;

※在c#6.0以上版本中,可以像字段一樣初始化自動屬性:

public

int myproperty = 10;

※自動屬性是編譯器為我們準備的一種語法糖;

5.當屬性所封裝的型別是乙個值型別時,使用get訪問器得到的物件不能直接對其成員進行修改,詳見;

二、通過反射可以獲取型別中所有的屬性資訊:

propertyinfo myproperties = typeof

(myclass).getproperties();

for (int i = 0; i < myproperties.length; i++)

1.在使用反射獲取型別的所有方法時,如果型別中包含屬性,也會獲取屬性中的公共訪問器所生成的方法:

typeof(myclass).getmethods(); //

get_mynum set_mynum tostring equals gethashcode gettype

※在使用反射獲取型別的所有欄位時,如果型別中包含自動屬性,會獲取到編譯器自動宣告的私有字段:

typeof(myclass).getfields(bindingflags.nonpublic | bindingflags.instance); //

k__backingfield

2.檢視宣告屬性的il**:

3.檢視使用屬性讀取和賦值的il**:

出處:

C 物件導向 屬性

一 屬性 property 作為類和結構的成員,是對字段的一種封裝方式,實際上是一種特殊的方法,被稱為訪問器 accessor 從而隱藏實現和驗證 有助於提高字段讀取和賦值的安全性和靈活性 1.屬性訪問器包含兩種型別 用於讀取並返回值的get訪問器,用於賦值新值的set屬性訪問器 通常將字段宣告為私...

C 物件導向 5 屬性

1 慣用法 屬性開頭字母大寫,字段開頭字母小寫。2 只用set或者只用get就可以定義唯讀或者只寫屬性 只寫的不常見 3 可以為set get設定訪問級別。4 例子,限制非法值的設定。5 net3.x 簡化set get public int age。適合於set get中沒有特殊邏輯 的情況。允許...

物件導向 屬性

資料屬性 configurable 能否通過delete刪除屬性而重新定義屬性,或能否把屬性修改為訪問器屬性。預設為 true。enumerable 能否通過for in迴圈返回屬性。預設為 true。writable 能否修改屬性的值。預設為 true。value 包含這個屬性的資料值。讀取屬性值...