一、屬性(Property)作為類和結構的成員,是對欄位的一種封裝方式,實際上是一種特殊的方法,被稱為訪問器(Accessor),從而隱藏實現和驗證代碼,有助於提高欄位讀取和賦值的安全性和靈活性; 1.屬性訪問器包含兩種類型:用於讀取並返回值的get訪問器,用於賦值新值的set屬性訪問器;通常將欄位 ...
一、屬性(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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。