一、屬性(Property)作為類和結構的成員,是對欄位的一種封裝方式,實際上是一種特殊的方法,被稱為訪問器(Accessor),從而隱藏實作和驗證代碼,有助于提高欄位讀取和賦值的安全性和靈活性;
1.屬性訪問器包含兩種型別:用于讀取并回傳值的get訪問器,用于賦值新值的set屬性訪問器;通常將欄位宣告為私有欄位,然后通過屬性來對其進行訪問:
private int myNum = 10; //屬性要讀取和賦值的欄位,也被稱為后備欄位(Backing Field) public int MyNum { get //get訪問器,必須回傳屬性宣告型別的回傳值 { return myNum; } set //set訪問器 { //do…賦值之前通常加入一些資料驗證邏輯 myNum = value; //使用關鍵字value表示使用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 int MyNum { get { return myNum; } private set //將set訪問器宣告為私有的 { myNum = value; } }
4.當訪問器中不需要任何額外邏輯時,可以使用自動實作屬性(Auto-Implemented Property,簡稱自動屬性,Auto Property)簡化屬性的宣告方式,不再需要單獨宣告一個欄位,將由編譯器創建僅可以通過訪問器訪問的專用、匿名欄位(無法在客戶端代碼中直接訪問該欄位),宣告訪問器時也不需要提供具體實作:
public int MyProperty { get; set; }
※自動屬性的訪問器依然可以使用訪問修飾符;
※自動屬性必須宣告get訪問器,只讀的自動屬性可以在初始化時和建構式中賦值;
※在C#6.0以上版本中,可以像欄位一樣初始化自動屬性:
public int MyProperty { get; set; } = 10;
※自動屬性是編譯器為我們準備的一種語法糖;
5.當屬性所封裝的型別是一個值型別時,使用get訪問器得到的物件不能直接對其成員進行修改,詳見;
二、通過反射可以獲取型別中所有的屬性資訊:
PropertyInfo[] myProperties = typeof(MyClass).GetProperties(); for (int i = 0; i < myProperties.Length; i++) { Console.WriteLine(myProperties[i].Name); //MyNum }
1.在使用反射獲取型別的所有方法時,如果型別中包含屬性,也會獲取屬性中的公共訪問器所生成的方法:
typeof(MyClass).GetMethods(); //get_MyNum set_MyNum ToString Equals GetHashCode GetType
※在使用反射獲取型別的所有欄位時,如果型別中包含自動屬性,會獲取到編譯器自動宣告的私有欄位:
typeof(MyClass).GetFields(BindingFlags.NonPublic | BindingFlags.Instance); //<MyProperty>k__BackingField
2.查看宣告屬性的IL代碼:


3.查看使用屬性讀取和賦值的IL代碼:

如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的認可是我寫作的最大動力!
作者:Minotauros
出處:https://www.cnblogs.com/minotauros/
本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/69622.html
標籤:其他
下一篇:C#呼叫易語言DLL
