本筆記摘抄自:記錄一下學習過程以備後續查用。
特性提供功能強大的方法,用以將元資料或宣告資訊與**(程式集、型別、方法、屬性等)相關聯。 特性與程式實體關聯後,即可在執行時使用名為「反射」的技術查詢特性。
特性,如serializable,它其實就是乙個類,定義方式跟類一樣,且所有特性都是直接或間接繼承自attribute基類。
自定義乙個特性permissionattribute:
[attributeusage(attributetargets.class, allowmultiple = false, inherited = false下面讓我們看看,如何建立乙個自定義特性?)]
public
class permissionattribute : attribute //
類名是特性的名稱
}
1)乙個自定義特性類必須直接或間接繼承自system.attribute特性類。
2)為該自定義特性類指定system.attributeusage特性,並指定限制引數(列舉system.attributetargets和可選的allowmultiple、inherited命名引數)。attributeusage的命名引數:allowmultiple表示是否允許多次使用在同一目標上、inherited表示是否同時應用於派生型別或過載版本。
3)類名是特性的名稱。
4)建構函式的引數是自定義特性的定位引數(應用該特性時必須放在引數列表的最前面),也可以是無參建構函式(如[serializable])。
5)任何公共的讀寫欄位或屬性都是可選的命名引數。
6)如果特性類包含乙個屬性,則該屬性必須為讀寫屬性。
示例**如下:
[permission("應用特性 [permission("01_01","使用者資料",compno ="db_system")] 其實是通過建構函式的呼叫來例項化乙個特性類。01_01
","使用者資料
",compno ="
db_system")]
public
class
users
public
int adduser(string userid,string
username)
}
根據約定,所有特性名稱都以單詞「attribute」結束,如可系列化標記特性serializable,它的全稱為serializableattribute。在**中使用特性時,不需要指定attribute字尾,如上面**,只需用permission即可代表permissionattribute特性。
利用反射的原理,關聯特性類與目標型別(反射:主要利用type類的屬性和方法來獲得乙個目標型別的型別資訊物件,然後根據該物件可以得到目標型別的資訊,如它的字段、屬性、方法名、類名等,有了這些資訊,下一步就可以為所欲為了,可以還原該型別,即反系列化,甚至建立乙個新型別)。
示例**如下:
classview codeprogram
}[permission(
"01_01
","使用者資料
",compno ="
db_system")]
public
class
users
public
int adduser(string userid,string
username)
}static
void main(string
args)}}
}
執行結果如下:
當編譯器發現乙個特性應用到乙個目標並發生關聯時:
1)首先會把"attribute"追加到特性的名稱(若使用了簡寫),形成完整的特性類名。
2)然後在其所有引入的命名空間中搜尋該特性類,若找不到該類或它與目標不匹配時,則產生編譯錯誤。
3)檢查傳遞給特性的引數,並查詢該特性中帶定位引數的建構函式(或無參建構函式)和其它可選的命名引數(特性類的公共字段、屬性),若找到匹配的建構函式,則例項化該特性類,編譯器還會把目標型別的元資料傳遞給程式集,反射可以從程式集中讀取元資料,若找不到則產生編譯錯誤。
關聯**也可以定義在目標型別的內部:
[permission("至於.net預定義特性的實現原理,我沒研究過,大概類似自定義特性吧,就比如系列化特性serializableattribute,實現原理我想大概是這樣:應用[serializable]時給目標做乙個「標記」,在.net內建程式集的某個地方判斷該目標型別是否應用了該特性,然後決定是否進行系列化操作。01_01
","使用者資料
",compno ="
db_system")]
public
class
users
public
int adduser(string userid,string
username)
}return0;}}
C 特性自用學習筆記
本文用於隨手記錄一些自己學習中碰到的c 特性。對於以下std tuple std tuple int,std string,double foo 在未有該特性前,對其解包很麻煩,使用std get要寫一大串 std cout std get 0 foo std get 1 foo std get 2...
c 學習筆記 附新特性
這裡有一些是新特性,有一些是為了描述新特性另外說明的一些東西。參考 入口 這篇文章對三種繼承方式講的很明白,感覺自己多說乙個字都不對勁。成員預設是private,繼承預設也是private。參考 入口 基類中的virtual 0,為純虛函式,否則為虛函式。class person class stu...
C 特性筆記
此處是本人對c 的一些筆記,c 高手請直接略過。翔哥看到了也請略過。函式前使用virtual修飾,表示該函式是虛函式,那麼虛函式有什麼用呢?虛函式對於程式的多型起到了很重要的作用。具體的使用簡單介紹一下 class a class b public a 然後在main函式中,我們如此呼叫 b pb ...