特性是用於在執行時傳遞程式中各種元素(類、方法、結構、列舉、元件等)的行為資訊的宣告性標籤。
官方的解讀不好理解,舉個常用的例子,平時會在類的上面加上[serializable],serializable就是testclass這個類的乙個特性,它表示這個類是可以被序列化的。如下圖:
.net框架提供兩種型別的特性:預定義特性和自定義特性。
預定義特性一:obsolete
這個預定義特性標記了不應被使用的程式實體。比如某個方法將被廢棄,不提倡再次使用,則可以在方法上加上這個特性,那麼在呼叫時就會提示相關資訊。
上面例項表示oldmethod方法不要再呼叫了,請使用newmethod方法來替代oldmethod方法。
obsolete特性有兩個引數:第乙個引數是描述性資訊;第二個引數為bool型別,如果該值為 true,編譯器應把該項目的使用當作乙個錯誤,編譯不通過。預設值是 false,編譯器生成乙個警告,程式仍可以執行。
預定義特性二:attributeusage
預定義特性 attributeusage 描述了如何使用乙個自定義特性類。它規定了特性可應用到的專案的型別。這個特性是應用在自定義特性上面的。
這個特性有三個引數,attributetargets引數必填,其他兩個引數可選。attributetargets引數規定特性可以應用在哪些元素上(類、屬性、方法等),allowmultiple引數為bool值,true表示該特性可以同時在乙個元素上寫多個(多用),預設為false,表示乙個元素上只能寫乙個該特性(單用)。inherited引數也是bool值,true表示該特性可被子類繼承,預設為false,子類不繼承該特性。
預定義特性三:conditional
這個預定義特性標記了乙個條件方法,其執行依賴於指定的預處理識別符號。具體用法見如下例項:
說明:識別符號可以隨意命名,這裡是舉個例子寫了do
這時候執行程式,執行結果和普通方法呼叫時一樣的,沒有任何區別。程式執行結果:
可以看到message被執行了。
如果把程式的第一行**#define do,去掉,那麼message方法將不會被執行。
執行結果:
可以看到message方法沒有被執行。
自定義特性
自定義特性,用於儲存宣告性的資訊,且可在執行時被檢索。該資訊根據設計標準和應用程式需要,可與任何目標元素相關。
建立並使用自定義特性包含四個步驟:
宣告自定義特性
構建自定義特性
在目標程式元素上應用自定義特性
通過反射訪問特性
下面通過乙個獲取列舉中描述資訊的例項展示自定義特性的用法:
呼叫:
最終執行結果,remark為『已凍結』。
C 特性Attribute學習
起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...
C 特性Attribute學習
起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...
c 特性 Attribute 學習總結2
通過特性提供額外行為的例項 自定義特性做資料驗證 效驗屬性值的大小和非空 學生類中有個qq的屬性,效驗qq不能小於100000 5位數 不能大於999999999999 12位數 並且qq的屬性不能為空。如果滿足這些效驗返回true,否則返回false。宣告乙個抽象類,所有的自定義特性都繼承自這個抽...